c# - 如何更改禁用的 WPF 按钮的按钮样式?
问题描述
我正在制作一个简单的井字游戏来熟悉 WPF,因为自从我使用这种格式以来已经有很长时间了。我一直在尝试禁用按钮,以防止人们在内容设置为 X 或 O 后选择相同的方块。这是我的按钮 XAML 代码示例:
<Button Name="btmRight" Margin="10 10 10 10" Grid.Column="2" Grid.Row="2" FontSize="128">
<Button.Style>
<Style TargetType="Button">
<Style.Triggers>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Opacity" Value="1"/>
<Setter Property="Foreground" Value="Black"/>
<Setter Property="Background" Value="LightGray"/>
</Trigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
默认情况下启用这些按钮。然后我使用一些简单的 C# 代码来禁用按钮,并根据转弯将内容设置为 X 或 O。然而,尽管样式触发器在每个按钮中,但格式永远不会改变。我可能会探索的是在代码中放置一个条件,如果按钮有内容,则不要更改任何内容,而不是在单击按钮时禁用按钮。这是我用于 C# 的示例:
mid.Click += (sender, e) =>
{
mid.Content = mark;
TurnSwap();
mid.IsEnabled = false;
IsComplete();
};
“mark”是一个根据转弯设置的字符串。内容设置为标记值,然后在设置内容后立即旋转。然后该按钮被禁用,游戏会检查是否有人赢了。如果我要选择手动禁用按钮,我会在条件中将该 C# 代码括起来,以检查默认情况下内容是否为“”。我觉得这个选项有点懒,我想单独学习概念的WPF解决方案。
解决方案
以下代码只是基于您的问题的示例。我没有实现井字游戏逻辑。它演示了如何实现按钮的通用样式以及通用 ClickEvent 的实现。您可以使用它并根据需要进行更改。
XAML
<Window x:Class="WPFTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WPFTest"
mc:Ignorable="d"
Title="TestWPF" Height="300" Width="400"
WindowStyle="None" WindowStartupLocation="CenterScreen">
<Window.Resources>
<Style x:Key="buttonStyle" TargetType="Button">
<Setter Property="OverridesDefaultStyle" Value="True" />
<Setter Property="Background" Value="MediumAquamarine" />
<Setter Property="Foreground" Value="MediumBlue" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Grid Background="{TemplateBinding Background}">
<ContentPresenter x:Name="MyContentPresenter"
Content="{TemplateBinding Content}"
HorizontalAlignment="Center"
VerticalAlignment="Center" />
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Opacity" Value="1"/>
<Setter Property="Foreground" Value="Black"/>
<Setter Property="Background" Value="LightGray"/>
</Trigger>
</Style.Triggers>
</Style>
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Button x:Name="btn1" Grid.Row="0" Grid.Column="0" Style="{StaticResource buttonStyle}" Click="btn_Click"/>
<Button x:Name="btn2" Grid.Row="0" Grid.Column="1" Style="{StaticResource buttonStyle}" Click="btn_Click"/>
<Button x:Name="btn3" Grid.Row="0" Grid.Column="2" Style="{StaticResource buttonStyle}" Click="btn_Click"/>
<Button x:Name="btn4" Grid.Row="1" Grid.Column="0" Style="{StaticResource buttonStyle}" Click="btn_Click"/>
<Button x:Name="btn5" Grid.Row="1" Grid.Column="1" Style="{StaticResource buttonStyle}" Click="btn_Click"/>
<Button x:Name="btn6" Grid.Row="1" Grid.Column="2" Style="{StaticResource buttonStyle}" Click="btn_Click"/>
<Button x:Name="btn7" Grid.Row="2" Grid.Column="0" Style="{StaticResource buttonStyle}" Click="btn_Click"/>
<Button x:Name="btn8" Grid.Row="2" Grid.Column="1" Style="{StaticResource buttonStyle}" Click="btn_Click"/>
<Button x:Name="btn9" Grid.Row="2" Grid.Column="2" Style="{StaticResource buttonStyle}" Click="btn_Click"/>
</Grid>
</Window>
CS
using System;
using System.Windows;
using System.Windows.Controls;
namespace WPFTest
{
public partial class MainWindow : Window
{
string sign = "X";
public MainWindow()
{
InitializeComponent();
}
private void btn_Click(object sender, RoutedEventArgs e)
{
try
{
Button currentButton = sender as Button;
currentButton.Content = sign;
currentButton.IsEnabled = false;
swapSign();
}
catch (Exception ex)
{
}
}
private void swapSign()
{
if (sign == "X")
sign = "O";
else
sign = "X";
}
}
}
UPDATE-1
我更改了XAML
. 检查上面。这里要注意的一件事是,您必须像我设置的那样设置Background
和Foreground
属性。Button
Style
推荐阅读
- solidity - 为智能合约创建 uniswap 对时出错
- c# - 保存带有excel排他锁的ExcelPackage,打开excel文件后出错 - C# - EPPlus
- java - 如何解决 FATAL [org.keycloak.services](ServerService 线程池
- testing - jmeter命令行模式的最大线程容量是多少?
- coffeescript - 在使用第二个片段后,初始片段中的占位符被删除
- android - Intent.createChooser() 没有显示 Whatsapp 和 Twitter
- mysql - 如何从同一查询中的字段引用的另一个数据库中选择列值?
- php - GD 库:从中心裁剪圆形图像
- flutter - 带有 SQFLite 的 Flutter 应用程序 - 选择不同的年份
- office-js - Windows 文件资源管理器/选择器的 OneDrive 文件链接打开问题