WPF - 自定义 Window 样式并使用图像最小化、最大化和关闭由不同数据触发的按钮
WPF - Customized Window Style and Use Image to Minimize, Maximize and Close Button Triggered by Different Data
我想使用自定义 window 样式并使用图像来最小化、最大化、正常和关闭按钮。
现在我希望当 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;
}
但是无论我是否点击按钮,它都不显示图像。
请帮帮我,谢谢!
不要直接设置 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>
原因是本地 属性 集优先于样式 setter,如 docs 中所述。
您还应该确保您的绑定有效。除非您已将 DataContext
设置为 this
,否则您应该像这样设置绑定的 RelativeSource
属性 以绑定到父 [=] 的 属性 25=]:
Binding="{Binding WindowState, RelativeSource={RelativeSource AncestorType=Window}}"
我想使用自定义 window 样式并使用图像来最小化、最大化、正常和关闭按钮。
现在我希望当 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;
}
但是无论我是否点击按钮,它都不显示图像。
请帮帮我,谢谢!
不要直接设置 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>
原因是本地 属性 集优先于样式 setter,如 docs 中所述。
您还应该确保您的绑定有效。除非您已将 DataContext
设置为 this
,否则您应该像这样设置绑定的 RelativeSource
属性 以绑定到父 [=] 的 属性 25=]:
Binding="{Binding WindowState, RelativeSource={RelativeSource AncestorType=Window}}"