Как изменить стиль кнопок для отключенных кнопок WPF? - PullRequest
0 голосов
/ 10 мая 2018

Я работаю над созданием простой игры в крестики-нолики, чтобы познакомиться с 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();
        };

«Метка» - это строка, которая устанавливается в зависимости от хода. Контенту присваивается значение метки, которое затем вращается сразу после того, как контент установлен. Затем кнопка отключается, и игра проверяет, выиграл ли кто-то еще. Если бы мне пришлось воспользоваться возможностью ручного отключения кнопки, я бы поместил этот код C # в условное выражение, чтобы проверить, является ли content = "", что по умолчанию. Я чувствую, что этот вариант немного ленив, и я хотел бы изучить решение WPF только для концепций.

1 Ответ

0 голосов
/ 10 мая 2018

Следующий код является лишь примером, основанным на вашем вопросе. У меня не реализована логика игры в крестики-нолики. Он демонстрирует, как реализовать общий стиль для кнопки, а также реализацию общего 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, как я установил.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...