2

我正在创建具有特定属性(和事件)的自定义 WPF 控件。我的按钮应该能够根据按钮当前设置的背景颜色来改变它的前景色。

现在,这在更改重写的 OnApplyTemplate 函数中的颜色时有效,但我还没有找到如何动态地执行此操作(在加载控件之后)。

如果我可以将 DependencyPropertyChanged 事件处理程序添加到控件背景属性,这将解决我的问题,但我不知道如何。

其他相当丑陋的解决方案可以工作:

  • 为每个 Button 单独的 backgroundworker 检查当前的背景颜色(如果存在足够多的按钮,这可能是一个真正的性能杀手)
  • 使用自定义 BackgroundColor 属性而不是 Background(可以,但看起来不是很优雅)

有人有解决办法吗?

编辑:

好的,在看到控件的Background 属性可能会根据其父Background 属性(如果没有专门设置)发生变化后,我将添加一个单独的BackgroundColor 属性,它实际上只影响Button 的背景。

4

1 回答 1

3

您可以使用绑定转换器来做到这一点。

http://tech.pro/tutorial/806/wpf-tutorial-binding-converters

或者,也许更容易实现,触发器。

http://wpftutorial.net/Triggers.html

编辑(一些例子):

Binding Converter Sample - 仅在 UserControl 上,但应该显示它是如何完成的。

在 UCButton.xaml.cs 中:

using System;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Media;

namespace Test3
{
    public partial class UCButton : UserControl
    {
        public UCButton()
        {
            InitializeComponent();

            this.DataContext = this;
        }
    }

    [ValueConversion(typeof(Brush), typeof(Brush))]
    public class BrushConverter : IValueConverter
    {
        public object Convert(object value, Type targetType,
               object parameter, System.Globalization.CultureInfo culture)
        {
            Brush background = (Brush)value;

            if (background == Brushes.Pink)
                return Brushes.Red;
            else if (background == Brushes.LightBlue)
                return Brushes.DarkBlue;
            else if (background == Brushes.LightGreen)
                return Brushes.DarkGreen;
            else
                return Brushes.Black;
        }

        public object ConvertBack(object value, Type targetType,
               object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
}

UCButton.xaml

<UserControl x:Class="Test3.UCButton"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:Test3" mc:Ignorable="d" 
             d:DesignHeight="29" d:DesignWidth="82">

    <UserControl.Resources>
        <local:BrushConverter x:Key="brushConverter" />
    </UserControl.Resources>

    <Grid>
        <Button Content="Button" Name="button1" Background="{Binding Background}" Foreground="{Binding Background, Converter={StaticResource brushConverter}}" />
    </Grid>
</UserControl>

使用触发器的示例:

在 MainWindow.xaml 添加:

<Window.Resources>
    <Style x:Key="buttonBrushStyle" TargetType="Button">
        <Style.Triggers>
            <Trigger Property="Background" Value="Pink">
                <Setter Property="Foreground" Value="Red" />
            </Trigger>
            <Trigger Property="Background" Value="LightBlue">
                <Setter Property="Foreground" Value="DarkBlue" />
            </Trigger>
        </Style.Triggers>
    </Style>
</Window.Resources>

<Button Style="{StaticResource buttonBrushStyle}" Content="Button"
   Height="23" Width="75" Background="Pink" />
<Button Style="{StaticResource buttonBrushStyle}" Content="Button"
   Height="23" Width="75" Background="LightBlue" />
于 2013-03-12T09:51:24.100 回答