自定义控件的后台依赖项属性更改时更改的事件

时间:2013-03-12 09:44:12

标签: wpf custom-controls

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

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

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

其他相当丑陋的解决方案可行:

  • 每个按钮的单独的背景工作者检查当前的背景颜色(如果有足够的按钮,则可能是真正的性能杀手)
  • 使用自定义BackgroundColor属性而不是Background(可行,但看起来不太优雅)

有人有解决方案吗?

编辑:

好的,在看到控件的Background属性可能会根据其父窗体属性(如果没有特别设置)更改后,我将添加一个单独的BackgroundColor属性,它实际上只影响Button的背景。

1 个答案:

答案 0 :(得分:3)

您可以使用绑定转换器执行此操作。

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

或者,可能更容易实现,触发器。

http://wpftutorial.net/Triggers.html

编辑(一些示例):

绑定转换器示例 - 仅在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" />