按钮模板中正在消失的形状
本文关键字:消失 按钮 | 更新日期: 2023-09-27 18:28:18
当我尝试在应用程序中的多个按钮上使用我创建的按钮样式时,发生了一些奇怪的事情。我为"播放"answers"暂停"按钮创建了两个按钮模板。我根据游戏状态改变风格。有多个窗口具有播放/暂停按钮。由于某种原因,除了一个按钮外,所有按钮的多边形都会消失,但样式的其余部分(颜色、按下的颜色等)仍然有效。
我正在设置按钮样式,如:
btnTelPlay.Style = (Style)FindResource("PlayButtonGreen");
btnTelPlay.Style = (Style)FindResource("GreenPause");
以下是样式:
<Style x:Key="PlayButtonGreen" TargetType="{x:Type Button}">
<Setter Property="SnapsToDevicePixels" Value="true"/>
<Setter Property="OverridesDefaultStyle" Value="true"/>
<Setter Property="Content">
<Setter.Value>
<Polygon Stroke="Black" StrokeThickness="1" Points="5,0 5,30, 30,15" Fill="White" />
</Setter.Value>
</Setter>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Border Name="Border" CornerRadius="5" BorderThickness="1"
Background="#FF3DEE2B"
BorderBrush="#404040">
<ContentPresenter RecognizesAccessKey="True"
HorizontalAlignment="Center"
VerticalAlignment="Center"
/>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsKeyboardFocused" Value="true">
<Setter TargetName="Border"
Property="BorderBrush" Value="#202020" />
</Trigger>
<Trigger Property="IsDefaulted" Value="true">
<Setter TargetName="Border"
Property="BorderBrush" Value="#202020" />
</Trigger>
<Trigger Property="IsMouseOver" Value="true">
<Setter TargetName="Border"
Property="Background" Value="#FF3DEE2B" />
</Trigger>
<Trigger Property="IsPressed" Value="true">
<Setter TargetName="Border"
Property="Background" Value="#FF39C72B" />
<Setter TargetName="Border"
Property="BorderBrush" Value="#606060" />
</Trigger>
<Trigger Property="IsEnabled" Value="false">
<Setter TargetName="Border"
Property="Background" Value="#EEEEEE" />
<Setter TargetName="Border"
Property="BorderBrush" Value="#AAAAAA" />
<Setter Property="Foreground" Value="#888888"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style x:Key="GreenPause" TargetType="{x:Type Button}">
<Setter Property="SnapsToDevicePixels" Value="true"/>
<Setter Property="OverridesDefaultStyle" Value="true"/>
<Setter Property="Content">
<Setter.Value>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Stretch">
<Rectangle Stroke="Black" StrokeThickness="1" Width="10" Height="30" Fill="White" Margin="0,0,2.5,0"></Rectangle>
<Rectangle Stroke="Black" StrokeThickness="1" Width="10" Height="30" Fill="White" Margin="2.5,0,0,0"></Rectangle>
</StackPanel>
</Setter.Value>
</Setter>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Border Name="Border" CornerRadius="5" BorderThickness="1"
Background="#FF3DEE2B"
BorderBrush="#404040">
<ContentPresenter RecognizesAccessKey="True"
HorizontalAlignment="Center"
VerticalAlignment="Center"
/>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsKeyboardFocused" Value="true">
<Setter TargetName="Border"
Property="BorderBrush" Value="#202020" />
</Trigger>
<Trigger Property="IsDefaulted" Value="true">
<Setter TargetName="Border"
Property="BorderBrush" Value="#202020" />
</Trigger>
<Trigger Property="IsMouseOver" Value="true">
<Setter TargetName="Border"
Property="Background" Value="#FF3DEE2B" />
</Trigger>
<Trigger Property="IsPressed" Value="true">
<Setter TargetName="Border"
Property="Background" Value="#FF39C72B" />
<Setter TargetName="Border"
Property="BorderBrush" Value="#606060" />
</Trigger>
<Trigger Property="IsEnabled" Value="false">
<Setter TargetName="Border"
Property="Background" Value="#EEEEEE" />
<Setter TargetName="Border"
Property="BorderBrush" Value="#AAAAAA" />
<Setter Property="Foreground" Value="#888888"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
我认为错误在于您将Content
属性设置为非Freezable
属性。这意味着WPF将无法轻松地将其复制到Style
的新实例中。如果您只是将ContentPresenter
替换为Content
Setter
中的任何设置,它应该可以工作。
感谢Abe Heidebrecht,你引导我找到了实现我想要的结果的正确方法:
取而代之的是:
<Setter Property="Content">
<Setter.Value>
<Polygon Stroke="Black" StrokeThickness="1" Points="5,0 5,30, 30,15" Fill="White" />
</Setter.Value>
</Setter>
我从<Setter Property="Content">
中删除了它,并将其放入ControlTemplate中,如:
<ControlTemplate TargetType="{x:Type Button}">
<Border Name="Border" CornerRadius="5" BorderThickness="1"
Background="#FF3DEE2B"
BorderBrush="#404040">
<Polygon Stroke="Black" StrokeThickness="1" Points="5,0 5,30, 30,15" Fill="White" HorizontalAlignment="Center" VerticalAlignment="Center" />
</Border>
例如,这里有一个完整的样式/模板:
<Style x:Key="PlayButtonGreen" TargetType="{x:Type Button}">
<Setter Property="SnapsToDevicePixels" Value="true"/>
<Setter Property="OverridesDefaultStyle" Value="true"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Border Name="Border" CornerRadius="5" BorderThickness="1"
Background="#FF3DEE2B"
BorderBrush="#404040">
<Polygon Stroke="Black" StrokeThickness="1" Points="5,0 5,30, 30,15" Fill="White" HorizontalAlignment="Center" VerticalAlignment="Center" />
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsKeyboardFocused" Value="true">
<Setter TargetName="Border"
Property="BorderBrush" Value="#202020" />
</Trigger>
<Trigger Property="IsDefaulted" Value="true">
<Setter TargetName="Border"
Property="BorderBrush" Value="#202020" />
</Trigger>
<Trigger Property="IsMouseOver" Value="true">
<Setter TargetName="Border"
Property="Background" Value="#FF3DEE2B" />
</Trigger>
<Trigger Property="IsPressed" Value="true">
<Setter TargetName="Border"
Property="Background" Value="#FF39C72B" />
<Setter TargetName="Border"
Property="BorderBrush" Value="#606060" />
</Trigger>
<Trigger Property="IsEnabled" Value="false">
<Setter TargetName="Border"
Property="Background" Value="#EEEEEE" />
<Setter TargetName="Border"
Property="BorderBrush" Value="#AAAAAA" />
<Setter Property="Foreground" Value="#888888"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>