首页 > 解决方案 > WPF - 自定义窗口样式并使用图像最小化、最大化和关闭由不同数据触发的按钮

问题描述

我想使用自定义窗口样式并使用图像来最小化、最大化、正常和关闭按钮。

现在我希望当 WindowState 最大化时,显示最大化图像(来自资源)。

当 WindowState 为 Normal 时,显示 Normal 图像(来自资源)。

Xaml 如下:

<Button Height="42" Width="42" Background="Transparent" BorderBrush="Transparent" Click="Button_Maximize_Click">
                    <Button.Style>
                        <Style TargetType="Button">
                            <Style.Triggers>
                                <DataTrigger Binding="{Binding WindowState}" Value="Maximized">
                                    <Setter Property="Background">
                                        <Setter.Value>
                                            <ImageBrush ImageSource="/AccuPick3D;component/Image/Maximize.png" Stretch="Uniform"/>
                                        </Setter.Value>
                                    </Setter>
                                </DataTrigger>
                                <DataTrigger Binding="{Binding WindowState}" Value="Normal">
                                    <Setter Property="Background">
                                        <Setter.Value>
                                            <ImageBrush ImageSource="/AccuPick3D;component/Image/Restore.png" Stretch="Uniform"/>
                                        </Setter.Value>
                                    </Setter>
                                </DataTrigger>
                            </Style.Triggers>
                        </Style>
                    </Button.Style>
                    <Button.ToolTip>
                        <ToolTip Style="{StaticResource ToolTipStyle}">Maximize or Restore</ToolTip>
                    </Button.ToolTip>
                </Button>

Button_Maximize_Click 事件:

private void Button_Maximize_Click(object sender, RoutedEventArgs e)
        {
            this.WindowState = (this.WindowState != WindowState.Maximized) ? WindowState.Maximized : WindowState.Normal;
        }

但无论我是否点击按钮,它都不会显示图像。

在此处输入图像描述

请帮助我,谢谢!

标签: wpfimagebuttonbackgrounddatatrigger

解决方案


不要Background直接设置属性。Style相反,您应该在setter中指定默认值:

<Button Height="42" Width="42" BorderBrush="Transparent" Click="Button_Maximize_Click">
    <Button.Style>
        <Style TargetType="Button">
            <Setter Property="Background" Value="Transparent" />
            <Style.Triggers>
                <DataTrigger Binding="{Binding WindowState}" Value="Maximized">
                    <Setter Property="Background">
                        <Setter.Value>
                            <ImageBrush ImageSource="/AccuPick3D;component/Image/Maximize.png" Stretch="Uniform"/>
                        </Setter.Value>
                    </Setter>
                </DataTrigger>
                <DataTrigger Binding="{Binding WindowState}" Value="Normal">
                    <Setter Property="Background">
                        <Setter.Value>
                            <ImageBrush ImageSource="/AccuPick3D;component/Image/Restore.png" Stretch="Uniform"/>
                        </Setter.Value>
                    </Setter>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Button.Style>
    <Button.ToolTip>
        <ToolTip Style="{StaticResource ToolTipStyle}">Maximize or Restore</ToolTip>
    </Button.ToolTip>
</Button>

原因是本地属性集优先于样式设置器,如文档中所述。

您还应该确保您的绑定有效。除非您设置了DataContextto this,否则您应该RelativeSource像这样设置绑定的属性以绑定到父窗口的属性:

Binding="{Binding WindowState, RelativeSource={RelativeSource AncestorType=Window}}"

推荐阅读