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