附加属性上的 WPF 触发器不起作用

标签 wpf triggers attached-properties wpf-style

我正在尝试更改通过附加属性作为按钮内容放置的图像,但由于某种原因图像没有改变,并且我在输出中没有得到任何异常或任何可靠的东西。 这是我附加的属性类代码:

public class ImageButton

{ #region 图像依赖属性

    /// <summary>
    /// An attached dependency property which provides an
    /// <see cref="ImageSource" /> for arbitrary WPF elements.
    /// </summary>
    public static DependencyProperty ImageProperty;

    /// <summary>
    /// Gets the <see cref="ImageProperty"/> for a given
    /// <see cref="DependencyObject"/>, which provides an
    /// <see cref="ImageSource" /> for arbitrary WPF elements.
    /// </summary>
    public static ImageSource GetImage(DependencyObject obj)
    {
        return (ImageSource)obj.GetValue(ImageProperty);
    }

    /// <summary>
    /// Sets the attached <see cref="ImageProperty"/> for a given
    /// <see cref="DependencyObject"/>, which provides an
    /// <see cref="ImageSource" /> for arbitrary WPF elements.
    /// </summary>
    public static void SetImage(DependencyObject obj, ImageSource value)
    {
        obj.SetValue(ImageProperty, value);
    }

    #endregion

static ImageButton()
    {
        //register attached dependency property
        var metadataImage = new FrameworkPropertyMetadata((ImageSource)null);
        ImageProperty = DependencyProperty.RegisterAttached("Image",
                                                            typeof(ImageSource),
                                                            typeof(ImageButton), metadataImage);
    }

}

这里是使用附加属性的样式代码(图像源设置为取值):

<Style TargetType="{x:Type Button}" x:Key="MyImageButton">
    <Setter Property="Background" Value="White"/>
    <Setter Property="SnapsToDevicePixels" Value="True" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Button}">
                <Border
                    x:Name="Border"
                    Background="White">
                    <ContentPresenter>
                        <ContentPresenter.Content>
                            <Grid
                                x:Name="Grid"
                                Background="White">
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="Auto"/>
                                    <ColumnDefinition Width="Auto"/>
                                </Grid.ColumnDefinitions>
                                <Image
                                     Grid.Column="0"
                                    Source="{Binding Path=(attachedProperties:ImageButton.Image),
                                                     RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type Button}}}"
                                    Width="30"
                                    Height="25"
                                    Margin="5,0,2,0"
                                    VerticalAlignment="Center"/>
                                <TextBlock
                                    x:Name="TextBlock"
                                    Grid.Column="1"
                                    Text="{Binding Path=(attachedProperties:ImageButton.StringContent),
                                                   RelativeSource={RelativeSource     Mode=FindAncestor,AncestorType={x:Type Button}}}"
                                    VerticalAlignment="Center"
                                    TextAlignment="Center"
                                    Margin="0,0,15,0"/>
                            </Grid>
                        </ContentPresenter.Content>
                    </ContentPresenter>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

最后是使用样式和触发器尝试更改图像源的 XAML 代码:

<Button
    Grid.Row="2"
    Width="30"
    attachedProperties:ImageButton.Image="..\Images\Down_Arrow_Enabled_Icon_25x25.png"
    Command="{Binding PriorityDownCommand}">
    <Button.Style>
       <Style TargetType="{x:Type Button}"
              BasedOn="{StaticResource MyImageButton}">
                <Style.Triggers>
                    <Trigger Property="IsEnabled" Value="False">
                        <Setter Property="attachedProperties:ImageButton.Image" Value="..\Images\Down_Arrow_Disabled_Icon_25x25.png"/>
                    </Trigger>
                </Style.Triggers>
       </Style>
    </Button.Style>

感谢任何能发现问题的人!!!

最佳答案

请看一下这个Dependency Property Value Precedence文章。

您的问题是您正在尝试使用样式触发器覆盖本地属性值,这是无法完成的,因为本地值具有更高的优先级值。

您应该在样式 setter 中设置默认属性:

<Button
    Grid.Row="2"
    Width="30"
    Command="{Binding PriorityDownCommand}">
    <Button.Style>
       <Style TargetType="{x:Type Button}" BasedOn="{StaticResource MyImageButton}">
           <Setter Property="attachedProperties:ImageButton.Image"  Value="..\Images\Down_Arrow_Enabled_Icon_25x25.png"/>
               <Style.Triggers>
                   <Trigger Property="IsEnabled" Value="False">
                       <Setter Property="attachedProperties:ImageButton.Image" Value="..\Images\Down_Arrow_Disabled_Icon_25x25.png"/>
                   </Trigger>
               </Style.Triggers>
      </Style>
    </Button.Style>
</Button>

关于附加属性上的 WPF 触发器不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25177286/

相关文章:

WPF TextBox lostfocus 作为附加属性

WPF/银光 : Attached Properties and Garbage Collection

c# - 仅使用 XAML 从 WPF 中的父窗口控制 UserControl 的 Storyboard

wpf - 有没有办法观看 WPF 路由事件?

sql - 根据在另一个表中删除的行删除表行

Mysql触发器将数据从一个表传递到另一个匹配表

java - 如何使用参数在触发器中设置模式?

storyboard - 无法通过代码在 Metro 风格应用程序中将 Storyboard.TargetProperty 设置为 CompositeTransform.Rotation

mysql - 如何使用MySQL数据适配器更新绑定(bind)到数据表的数据网格

C#:创建图形屏幕保护程序