C# WPF用户控制;触发器和更改其他控件

C# WPF用户控制;触发器和更改其他控件,c#,wpf,xaml,triggers,C#,Wpf,Xaml,Triggers,我创建了一个WPF用户控件,其中包含一个按钮和一个组合框。我想根据鼠标的位置改变两者的样式,所以鼠标在上面的UIElement是黑色的,另一个是红色的。如果两者都未设置样式,则将应用默认样式 别担心,这个噩梦般的配色方案只是为了说明这个概念 提前感谢你的帮助 XAML <UserControl x:Class="WpfUserControlSample.ToolbarButtonCombo" xmlns="http://schemas.microsoft.com/

我创建了一个WPF用户控件,其中包含一个按钮和一个组合框。我想根据鼠标的位置改变两者的样式,所以鼠标在上面的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>

有两个问题

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

<DataTrigger Binding="{Binding IsButtonMouseOver, RelativeSource={RelativeSource Self}}" Value="True">
    <Setter Property="ButtonStyle" Value="Black"/>
    <Setter Property="ComboStyle" Value="Red"/>                    
</DataTrigger>
或者更正确地说,将IsButtonUse设置为只读依赖项属性,如下所示:

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方法不受dependency属性的支持。

如果您在IsButtonSmouseOver中放置断点,或者在返回之前添加一些Console.WriteLine,您将永远不会看到它被调用,我不是很有经验,但这部分对我来说似乎很奇怪,我不认为你与现实世界有什么联系。就我个人而言,如果可以的话,我会直接使用IsMouseOver属性的普通触发器,但我是个新手,不知道如何更改现有的代码。祝你好运。这很有效,我现在可以看出我错在哪里了。谢谢!
<Trigger Property="IsButtonMouseOver" Value="True">
    <Setter Property="ButtonStyle" Value="Black"/>
    <Setter Property="ComboStyle" Value="Red"/>                    
</Trigger>
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;
    }
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); }
}