Как изменить стиль кнопки для отключенных кнопок 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# условным условием, чтобы проверить, не является ли content = "", что есть по умолчанию. Мне кажется, что этот вариант немного ленив, и я хотел бы изучить решение WPF только для концепций.

Что такое mid (кнопка)? Как вы реализовали событие нажатия кнопки для всех кнопок?

Gaurang Dave 10.05.2018 07:54

Средняя кнопка - это кнопка в центре сетки крестиков-ноликов 3x3. Каждый фрагмент кода берется из источника случайным образом. Поскольку WPF требует только одного экземпляра кнопки, я использую все кнопки в коде WPF и устанавливаю их функции в C#. Два перечисленных кода не имеют ничего общего друг с другом напрямую, это просто примеры кода, присвоенного всем кнопкам.

Anthony Smyth 10.05.2018 07:59

Я считаю, что вы подход неверный. Вы можете иметь событие щелчка одной кнопки для всех кнопок и можете использовать объект sender для получения каждой кнопки, когда над ней выполняется действие. А для шаблона вы можете определить его в ресурсе окна и получить к нему доступ со всех кнопок. Надеюсь, вы понимаете, о чем я. Дай мне знать, если тебе еще понадобится помощь.

Gaurang Dave 10.05.2018 08:02

Я понимаю, что вы имеете в виду под C#. Сначала я попробовал это и обнаружил, что, поскольку я использую кнопку сброса, которая использует отдельный код, мне нужно писать выражения щелчка индивидуально. Это раздражает, но, по крайней мере, эта часть работает. У меня проблемы с пониманием форматирования отключенных кнопок. Сначала я попытался определить его с помощью ресурса страницы с тем же результатом. Я думаю, что это что-то с моим XAML, скорее всего, простое исправление, которое мне не хватает.

Anthony Smyth 10.05.2018 08:07

Приведу образец. Дайте мне несколько минут, чтобы написать его.

Gaurang Dave 10.05.2018 08:09

Хорошо спасибо за вашу помощь

Anthony Smyth 10.05.2018 08:12

Проверьте образец ниже. Это работает. Я это тестировал.

Gaurang Dave 10.05.2018 08:18
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
7
2 116
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

После реализации вашего кода кнопки остаются без изменений. Они все еще выглядят серыми. Не могли бы вы добавить фрагмент того, как выглядят ваши кнопки?

Anthony Smyth 10.05.2018 08:32

@AnthonySmyth проверьте обновление в ответе выше. Я изменил стиль

Gaurang Dave 10.05.2018 08:41

Спасибо за ваше время и всю вашу помощь! @ Гауранг Дэйв

Anthony Smyth 10.05.2018 08:44

Другие вопросы по теме