У меня есть некоторый стиль кодирования для кастомного максимума Button, и у меня возникают некоторые проблемы.
<Style TargetType = "Button">
<Setter Property = "Template">
<Setter.Value>
<ControlTemplate TargetType = "Button">
<Border Background = "{TemplateBinding Background}" BorderThickness = "0">
<ContentPresenter Margin = "10,7,10,7" HorizontalAlignment = "Center" VerticalAlignment = "Center"/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<Setter Property = "Background" Value = "#01000000"/>
<Setter Property = "Foreground" Value = "#FFFFFFFF"/>
<Setter Property = "Margin" Value = "0"/>
<Style.Triggers>
<Trigger Property = "IsMouseOver" Value = "True">
<Setter Property = "Background" Value = "#50FFFFFF"/>
</Trigger>
<!--This trigger fails-->
<DataTrigger Binding = "{Binding WindowState, RelativeSource = {RelativeSource FindAncestor, AncestorType=acrylic:AcrylicWindow}}" Value = "Maximized">
<Setter Property = "Content">
<Setter.Value>
<Grid>
<Path Height = "10" Width = "10" Data = "M2,0 L8,0 L8,6 M0,3 L6,3 M0,2 L6,2 L6,8 L0,8 Z"
Stroke = "{Binding Path=Foreground, RelativeSource = {RelativeSource FindAncestor,AncestorType = {x:Type Button}}}"
StrokeThickness = "1"
SnapsToDevicePixels = "True"/>
</Grid>
</Setter.Value>
</Setter>
</DataTrigger>
<!--It Works Correctly-->
<DataTrigger Binding = "{Binding WindowState, RelativeSource = {RelativeSource FindAncestor, AncestorType=acrylic:AcrylicWindow}}" Value = "Normal">
<Setter Property = "Content">
<Setter.Value>
<Grid>
<Path Width = "10" Height = "10" Data = "F1M0,0L0,9 9,9 9,0 0,0 0,3 8,3 8,8 1,8 1,3z"
Fill = "{Binding Path=Foreground, RelativeSource = {RelativeSource AncestorType = {x:Type Button}}}"
SnapsToDevicePixels = "True"/>
</Grid>
</Setter.Value>
</Setter>
</DataTrigger>
</Style.Triggers>
</Style>
Когда Window развернут, содержимое Button исчезает, он не показывает путь, он пуст (но доступен для кликов, и затухание в InMouseOver работает). Когда Window находится в нормальном состоянии, содержимое кнопок правильное.
Я пытался изменить данные пути, но не увидел никаких изменений.





Попробуйте определить контент как ресурс:
<Style TargetType = "Button">
<Style.Resources>
<Grid x:Key = "max">
<Path Height = "10" Width = "10" Data = "M2,0 L8,0 L8,6 M0,3 L6,3 M0,2 L6,2 L6,8 L0,8 Z"
Stroke = "{Binding Path=Foreground, RelativeSource = {RelativeSource FindAncestor,AncestorType = {x:Type Button}}}"
StrokeThickness = "1"
SnapsToDevicePixels = "True"/>
</Grid>
<Grid x:Key = "normal">
<Path Width = "10" Height = "10" Data = "F1M0,0L0,9 9,9 9,0 0,0 0,3 8,3 8,8 1,8 1,3z"
Fill = "{Binding Path=Foreground, RelativeSource = {RelativeSource AncestorType = {x:Type Button}}}"
SnapsToDevicePixels = "True"/>
</Grid>
</Style.Resources>
<Setter Property = "Template">
<Setter.Value>
<ControlTemplate TargetType = "Button">
<Border Background = "{TemplateBinding Background}" BorderThickness = "0">
<ContentPresenter Margin = "10,7,10,7" HorizontalAlignment = "Center" VerticalAlignment = "Center"/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<Setter Property = "Background" Value = "#01000000"/>
<Setter Property = "Foreground" Value = "#FFFFFFFF"/>
<Setter Property = "Margin" Value = "0"/>
<Style.Triggers>
<Trigger Property = "IsMouseOver" Value = "True">
<Setter Property = "Background" Value = "#50FFFFFF"/>
</Trigger>
<DataTrigger Binding = "{Binding WindowState, RelativeSource = {RelativeSource FindAncestor, AncestorType=Window}}" Value = "Maximized">
<Setter Property = "Content" Value = "{StaticResource max}" />
</DataTrigger>
<DataTrigger Binding = "{Binding WindowState, RelativeSource = {RelativeSource FindAncestor, AncestorType=Window}}" Value = "Normal">
<Setter Property = "Content" Value = "{StaticResource normal}" />
</DataTrigger>
</Style.Triggers>
</Style>
Это из-за привязки переднего плана. Если вы установите Stroke of the Path на фиксированное значение, ваш пример, вероятно, будет работать.
Виной всему такая строчка:
Stroke = "{Binding Path=Foreground, RelativeSource = {RelativeSource FindAncestor,AncestorType = {x:Type Button}}}"
Причина в том, что эта привязка не может быть разрешена при создании экземпляра установщика, поскольку Path еще не существует.
Когда вы используете
Stroke = "#FFFFFFFF"
вместо этого он будет работать.
Определите цвет в ресурсе и используйте что-нибудь вроде
Stroke = "{StaticResource ButtonForegroundColor}"
для лучшей поддержки вашего кода XAML.
Вау, работает как шарм. Спасибо. Вы знаете, почему такое поведение? Я новичок в WPF