WPF UserControls; 触发并更改其他控件

我创建了一个包含Button和ComboBox的WPF UserControl。 我想改变两者的风格,取决于鼠标的位置,因此鼠标hover的UIElement颜色为黑色,另一个颜色为红色。 如果两者都未设置样式,则将应用默认样式。

别担心,这种噩梦般的配色方案只是为了说明这个概念!

在此先感谢您的帮助。

XAML

        <!--     -->         

代码隐藏

 namespace WpfUserControlSample { public partial class ToolbarButtonCombo : UserControl, INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged(string propertyName) { if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } public ToolbarButtonCombo() { InitializeComponent(); btn.MouseEnter += new MouseEventHandler(btn_MouseChanged); btn.MouseLeave += new MouseEventHandler(btn_MouseChanged); } void btn_MouseChanged(object sender, MouseEventArgs e) { OnPropertyChanged("IsButtonMouseOver"); } public bool IsButtonMouseOver { get { return btn.IsMouseOver; } } public static readonly DependencyProperty IsButtonMouseOverProperty = DependencyProperty.Register("IsButtonMouseOver", typeof(string), typeof(ToolbarButtonCombo), new PropertyMetadata("false")); public string ButtonStyle { get; set; } public static readonly DependencyProperty ButtonStyleProperty = DependencyProperty.Register("ButtonStyle", typeof(string), typeof(ToolbarButtonCombo)); public string ComboStyle { get; set; } public static readonly DependencyProperty ComboStyleProperty = DependencyProperty.Register("ComboStyle", typeof(string), typeof(ToolbarButtonCombo)); } } 

有两个问题。

首先,您的DataTrigger绑定看起来不正确。 他们在DataContext上寻找IsButtonMouseOver,而不是关联的控件。 你需要使用:

     

要么:

     

另一个是你的IsButtonMouseOver未正确实现。 你应该做的事情如下:

 public static readonly DependencyProperty IsButtonMouseOverProperty = DependencyProperty.Register("IsButtonMouseOver", typeof(bool), typeof(ToolbarButtonCombo), new PropertyMetadata(false)); public bool IsButtonMouseOver { get { return (bool)this.GetValue(IsButtonMouseOverProperty); } set { this.SetValue(IsButtonMouseOverProperty, value); } } void btn_MouseChanged(object sender, MouseEventArgs e) { this.IsButtonMouseOver = this.btn.IsMouseOver; } 

或者更准确地说,使IsButtonMouseOver成为只读依赖项属性,如下所示:

 private static readonly DependencyPropertyKey IsButtonMouseOverPropertyKey = DependencyProperty.RegisterReadOnly("IsButtonMouseOver", typeof(bool), typeof(ToolbarButtonCombo), new FrameworkPropertyMetadata(false)); public static readonly DependencyProperty IsButtonMouseOverProperty = ToolbarButtonCombo.IsButtonMouseOverPropertyKey.DependencyProperty; public bool IsButtonMouseOver { get { return (bool)this.GetValue(IsButtonMouseOverProperty); } private set { this.SetValue(IsButtonMouseOverPropertyKey, value); } } 

您的其他属性(ButtonStyle和ComboStyle)也需要正确实现,并且它们的get / set方法不受依赖项属性的支持。