Я работаю над созданием простой игры в крестики-нолики, чтобы познакомиться с 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 только для концепций.
Средняя кнопка - это кнопка в центре сетки крестиков-ноликов 3x3. Каждый фрагмент кода берется из источника случайным образом. Поскольку WPF требует только одного экземпляра кнопки, я использую все кнопки в коде WPF и устанавливаю их функции в C#. Два перечисленных кода не имеют ничего общего друг с другом напрямую, это просто примеры кода, присвоенного всем кнопкам.
Я считаю, что вы подход неверный. Вы можете иметь событие щелчка одной кнопки для всех кнопок и можете использовать объект sender для получения каждой кнопки, когда над ней выполняется действие. А для шаблона вы можете определить его в ресурсе окна и получить к нему доступ со всех кнопок. Надеюсь, вы понимаете, о чем я. Дай мне знать, если тебе еще понадобится помощь.
Я понимаю, что вы имеете в виду под C#. Сначала я попробовал это и обнаружил, что, поскольку я использую кнопку сброса, которая использует отдельный код, мне нужно писать выражения щелчка индивидуально. Это раздражает, но, по крайней мере, эта часть работает. У меня проблемы с пониманием форматирования отключенных кнопок. Сначала я попытался определить его с помощью ресурса страницы с тем же результатом. Я думаю, что это что-то с моим XAML, скорее всего, простое исправление, которое мне не хватает.
Приведу образец. Дайте мне несколько минут, чтобы написать его.
Хорошо спасибо за вашу помощь
Проверьте образец ниже. Это работает. Я это тестировал.





Следующий код - это просто образец, основанный на вашем вопросе. У меня не реализована логика игры в крестики-нолики. Он демонстрирует, как реализовать общий стиль для кнопки, а также внедрение общего 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, как я установил.
После реализации вашего кода кнопки остаются без изменений. Они все еще выглядят серыми. Не могли бы вы добавить фрагмент того, как выглядят ваши кнопки?
@AnthonySmyth проверьте обновление в ответе выше. Я изменил стиль
Спасибо за ваше время и всю вашу помощь! @ Гауранг Дэйв
Что такое
mid(кнопка)? Как вы реализовали событие нажатия кнопки для всех кнопок?