gpt4 book ai didi

wpf - 自定义控件的背景依赖属性更改时的更改事件

转载 作者:行者123 更新时间:2023-12-04 05:07:22 25 4
gpt4 key购买 nike

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

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

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

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

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

  • 有人有解决办法吗?

    编辑:

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

    最佳答案

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

    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" />

    关于wpf - 自定义控件的背景依赖属性更改时的更改事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15357804/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com