CSharp - WPF usercontrol ;触发器和更改其他控件

  显示原文与译文双语对照的内容

我创建了一个包含按钮和组合框的WPF UserControl 。 我想改变两者的风格,根据鼠标的位置,使用鼠标的UIElement是颜色黑色,另一种颜色。 如果两者都没有设置样式,则默认样式将应用。

别担心这个恶梦般的配色方案只是用来说明 !

感谢你的帮助。

XAML


<UserControl x:Class="WpfUserControlSample.ToolbarButtonCombo"
 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:WpfUserControlSample"
 x:Name="Control"
 mc:Ignorable="d" 
 d:DesignHeight="30"> 
 <UserControl.Resources>
 <Style TargetType="{x:Type local:ToolbarButtonCombo}">
 <Style.Triggers>
 <DataTrigger Binding="{Binding IsButtonMouseOver}" Value="True">
 <Setter Property="ButtonStyle" Value="Black"/>
 <Setter Property="ComboStyle" Value="Red"/> 
 </DataTrigger>
 <!--
 <DataTrigger Binding="{Binding IsComboMouseOver}" Value="True">
 <Setter Property="ButtonStyle" Value="Red"/>
 <Setter Property="ComboStyle" Value="Black"/>
 </DataTrigger>
 -->
 </Style.Triggers>
 </Style>
 </UserControl.Resources>
 <StackPanel Orientation="Horizontal" Height="30">
 <Button Name="btn" Background="{Binding ButtonStyle,ElementName=Control,Mode=OneWay}">
 Test
 </Button>
 <ComboBox Name="cmb" Background="{Binding ComboStyle,ElementName=Control,Mode=OneWay}"></ComboBox>
 </StackPanel>
</UserControl>

:的::


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,而不是关联的控件。 你需要使用:


<DataTrigger Binding="{Binding IsButtonMouseOver, RelativeSource={RelativeSource Self}}" Value="True">
 <Setter Property="ButtonStyle" Value="Black"/>
 <Setter Property="ComboStyle" Value="Red"/> 
</DataTrigger>

或者:


<Trigger Property="IsButtonMouseOver" Value="True">
 <Setter Property="ButtonStyle" Value="Black"/>
 <Setter Property="ComboStyle" Value="Red"/> 
</Trigger>

另一个是你的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 ),并且它们的获取/设置方法不受依赖项属性的支持。

原作者:
...