Wpf 覆盖按钮时';使用资源的默认样式,不会触发单击事件

Wpf 覆盖按钮时';使用资源的默认样式,不会触发单击事件,wpf,xaml,styles,Wpf,Xaml,Styles,我正在尝试在WPF中创建一个Tic-Tac-Toe游戏,并使用3X3网格中的按钮实现同样的效果。我想覆盖默认的按钮样式,例如,当鼠标悬停在按钮上时,背景颜色不应该改变。但是在创建静态资源之后,按钮单击事件不再被触发。这是我的密码: 按钮(此按钮不会触发单击事件): 按钮(此按钮触发单击事件): 资源: <Window.Resources> <Style x:Key="TicTacToeButtonStyle" TargetType="Button">

我正在尝试在WPF中创建一个Tic-Tac-Toe游戏,并使用3X3网格中的按钮实现同样的效果。我想覆盖默认的按钮样式,例如,当鼠标悬停在按钮上时,背景颜色不应该改变。但是在创建静态资源之后,按钮单击事件不再被触发。这是我的密码:

按钮(此按钮不会触发单击事件):


按钮(此按钮触发单击事件):


资源:

<Window.Resources>
    <Style x:Key="TicTacToeButtonStyle" TargetType="Button">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="Button">
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsMouseOver" Value="True">
                            <Setter Property="Background" Value="Transparent"></Setter>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</Window.Resources>


此外,Button1X1中设置的边框厚度属性也不会反映出来

按钮控件的可视元素由其模板创建。您将模板替换为一个不创建任何内容的模板,因此没有可单击的内容

如果您希望按钮始终是透明的,则不需要在鼠标悬停时使用触发器将其设置为透明。下面的样式将创建一个可单击的按钮,默认情况下该按钮没有可见的UI——但它仍然存在,因此您仍然可以单击它

<Style x:Key="TicTacToeButtonStyle" TargetType="Button">
    <Setter Property="BorderBrush" Value="Black" />
    <Setter Property="Background" Value="Transparent" />
    <Setter Property="BorderThickness" Value="0" />

    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Button">
                <Border
                    BorderBrush="{TemplateBinding BorderBrush}"
                    BorderThickness="{TemplateBinding BorderThickness}"
                    Background="{TemplateBinding Background}"
                    >
                    <ContentPresenter
                        VerticalAlignment="Center"
                        HorizontalAlignment="Center"
                        />
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

这里有一个快速的Tic Tac趾板示例。我使用UniformGrid而不是常规网格来简化XAML。您可能需要更改栅格的高度和宽度。注意,我刚刚修改了上面的样式,因此它有一个不透明的边界笔刷

我没有添加单击处理程序。您已经知道如何添加这些

一种更为复杂的方法是使用ItemTemplate的ItemsControl,但这将使您现在开始使用它

<UniformGrid
    Width="300"
    Height="300"
    Rows="3"
    Columns="3"
    >
    <!-- BorderThickness is comma-separated values for Left,Top,Right,Bottom -->
    <Button Style="{StaticResource TicTacToeButtonStyle}" Name="Button1X1" BorderThickness="0,0,1,1" />
    <Button Style="{StaticResource TicTacToeButtonStyle}" Name="Button1X2" BorderThickness="1,0,1,1" />
    <Button Style="{StaticResource TicTacToeButtonStyle}" Name="Button1X3" BorderThickness="1,0,0,1" />

    <Button Style="{StaticResource TicTacToeButtonStyle}" Name="Button2X1" BorderThickness="0,1,1,1" />
    <Button Style="{StaticResource TicTacToeButtonStyle}" Name="Button2X2" BorderThickness="1,1,1,1" />
    <Button Style="{StaticResource TicTacToeButtonStyle}" Name="Button2X3" BorderThickness="1,1,0,1" />

    <Button Style="{StaticResource TicTacToeButtonStyle}" Name="Button3X1" BorderThickness="0,1,1,0" />
    <Button Style="{StaticResource TicTacToeButtonStyle}" Name="Button3X2" BorderThickness="1,1,1,0" />
    <Button Style="{StaticResource TicTacToeButtonStyle}" Name="Button3X3" BorderThickness="1,1,0,0" />
</UniformGrid>


你的目标是什么?您想要一个始终不可见的不可见按钮吗?当鼠标不在其上方时,是否希望其可见?模板是创建按钮视觉元素的工具。现在,它什么也没有创造。替换模板时,已替换显示边框的对象。你必须用某种东西替换它。我希望它始终是一个不可见的按钮,即使在鼠标悬停时也是如此。当你说你希望它不可见时,你的意思是你仍然希望看到它周围的边框吗?因为控件模板中没有可视元素。改用。请参阅示例。如果希望按钮内部没有任何内容,请使用
边框
作为
控制模板
根目录,并将
背景
属性设置为
透明
。谢谢:)单击事件现在可以正常工作。同样在鼠标悬停时,按钮仍然不可见。但是border thickness属性没有设置。是的,它像一个符咒一样工作。我意识到我错在哪里了。谢谢:)
<Style x:Key="TicTacToeButtonStyle" TargetType="Button">
    <Setter Property="BorderBrush" Value="Black" />
    <Setter Property="Background" Value="Transparent" />
    <Setter Property="BorderThickness" Value="0" />

    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Button">
                <Border
                    BorderBrush="{TemplateBinding BorderBrush}"
                    BorderThickness="{TemplateBinding BorderThickness}"
                    Background="{TemplateBinding Background}"
                    >
                    <ContentPresenter
                        VerticalAlignment="Center"
                        HorizontalAlignment="Center"
                        />
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
<UniformGrid
    Width="300"
    Height="300"
    Rows="3"
    Columns="3"
    >
    <!-- BorderThickness is comma-separated values for Left,Top,Right,Bottom -->
    <Button Style="{StaticResource TicTacToeButtonStyle}" Name="Button1X1" BorderThickness="0,0,1,1" />
    <Button Style="{StaticResource TicTacToeButtonStyle}" Name="Button1X2" BorderThickness="1,0,1,1" />
    <Button Style="{StaticResource TicTacToeButtonStyle}" Name="Button1X3" BorderThickness="1,0,0,1" />

    <Button Style="{StaticResource TicTacToeButtonStyle}" Name="Button2X1" BorderThickness="0,1,1,1" />
    <Button Style="{StaticResource TicTacToeButtonStyle}" Name="Button2X2" BorderThickness="1,1,1,1" />
    <Button Style="{StaticResource TicTacToeButtonStyle}" Name="Button2X3" BorderThickness="1,1,0,1" />

    <Button Style="{StaticResource TicTacToeButtonStyle}" Name="Button3X1" BorderThickness="0,1,1,0" />
    <Button Style="{StaticResource TicTacToeButtonStyle}" Name="Button3X2" BorderThickness="1,1,1,0" />
    <Button Style="{StaticResource TicTacToeButtonStyle}" Name="Button3X3" BorderThickness="1,1,0,0" />
</UniformGrid>