代码之家  ›  专栏  ›  技术社区  ›  Anthony Smyth

如何更改禁用WPF按钮的按钮样式?

  •  1
  • Anthony Smyth  · 技术社区  · 6 年前

    我正在制作一个简单的tic-tac-toe游戏来熟悉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>
    

    mid.Click += (sender, e) =>
            {
                mid.Content = mark;
                TurnSwap();
                mid.IsEnabled = false;
                IsComplete();
            };
    

    “标记”是根据回合设置的字符串。内容设置为标记值,然后在设置内容后立即旋转。然后该按钮被禁用,游戏将检查是否有人赢了。如果我选择手动禁用按钮,我会将该C#代码包围在一个条件中,以检查内容是否为=,默认情况下为=。我觉得这个选项有点懒惰,我想学习WPF解决方案的概念。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Gaurang Dave    6 年前

    下面的代码只是基于您的问题的一个示例。我没有实现tic-tac-toe游戏逻辑。 它演示了如何实现按钮的公共样式,以及公共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";
            }
        }
    }
    

    更新-1 我在中更改了样式 XAML .检查以上内容。这里需要注意的一点是,您必须设置 Background Foreground 的属性 Button Style 就像我设定的那样。