C# 在按钮模板中消失形状

C# 在按钮模板中消失形状,c#,wpf,xaml,C#,Wpf,Xaml,当我尝试使用我在应用程序中的多个按钮上创建的按钮样式时,发生了一些奇怪的事情。我为播放和暂停按钮创建了两个按钮模板。我会根据游戏状态更改样式。有多个窗口具有播放/暂停按钮。由于某种原因,除了一个按钮外,所有按钮的多边形都会消失,但样式的其他部分(颜色、按下的颜色等)仍然有效 我将按钮样式设置为: btnTelPlay.Style = (Style)FindResource("PlayButtonGreen"); btnTelPlay.Style = (Style)FindResource("Gr

当我尝试使用我在应用程序中的多个按钮上创建的按钮样式时,发生了一些奇怪的事情。我为播放和暂停按钮创建了两个按钮模板。我会根据游戏状态更改样式。有多个窗口具有播放/暂停按钮。由于某种原因,除了一个按钮外,所有按钮的多边形都会消失,但样式的其他部分(颜色、按下的颜色等)仍然有效

我将按钮样式设置为:

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>


我认为错误在于您将
内容
属性设置为不可自由使用的内容。这意味着WPF将无法轻松地将其复制到
样式的新实例中。如果您只是将您的
内容演示器
替换为您在
内容
设置器
中设置的任何内容,它应该可以工作。

感谢Abe Heidebrecht,您引导我找到了实现我想要的结果的正确方法:

与此相反:

<Setter Property="Content">
    <Setter.Value>
        <Polygon Stroke="Black" StrokeThickness="1" Points="5,0  5,30, 30,15" Fill="White" />
    </Setter.Value>
</Setter>

我将其从
中删除,并将其放入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>


如何设置代码中按钮的样式?如果样式为
PlayButton.Style=this.Resources[“PlayButtonGreen”]作为样式,则必须是这样。如果在
App.xaml
中使用样式,则:
PlayButton.Style=Application.Current.Resources[“PlayButtonGreen”]作为样式我想我没有解释清楚。换句话说,只要每个按钮只有1个(1次播放、1次暂停、1次停止),我就可以获得正确按钮的正确资源。当我打开第二个窗口(现在每个按钮有两个)时,新窗口上的按钮从原始窗口上的其他按钮窃取多边形/矩形,我只剩下原始窗口上的颜色。@user2697208我更新了答案,希望能解决您的问题。谢谢Abe,帮我解决这个问题!!