Покрас выделенной ячейки в шахматах
При клике мне нужно, чтобы ячейка красилась в заданный цвет. Но в моём коде при клике красится весь Canvas. Подскажите, что я делаю не так и как можно это исправить?
private void field_SizeChanged(object sender, SizeChangedEventArgs e)
{
field.Children.Clear();
var cellSize = field.ActualHeight / 8;
Placement.Initialisation();
for(int i = 0; i < 8; i++)
{
for(int j = 0; j < 8; j++)
{
isFilled = j % 2 == 0 ? i % 2 == 0 : i % 2 != 0;
var cell = new Rectangle();
cell.Height = cellSize;
cell.Width = cellSize;
cell.Fill = isSelected
? Brushes.Red
: isFilled ? Brushes.RosyBrown : Brushes.White;
cell.Stroke = Brushes.Black;
cell.StrokeThickness = 1;
field.Children.Add(cell);
Canvas.SetTop(cell, (i) * cellSize);
Canvas.SetLeft(cell, (j) * cellSize);
var text = new TextBlock();
if (string.IsNullOrWhiteSpace(Placement.field[i, j]))
{
text.Text = "";
}
else
{
text.Text = Placement.field[i, j];
}
text.VerticalAlignment = VerticalAlignment.Center;
text.HorizontalAlignment = HorizontalAlignment.Center;
text.FontSize = 30;
field.Children.Add(text);
cell.MouseLeftButtonUp += Clicked;
text.MouseLeftButtonUp += Clicked;
Canvas.SetTop(text, (i) * cellSize);
Canvas.SetLeft(text, (j) * cellSize);
}
}
}
public void Clicked(object sender, MouseButtonEventArgs e)
{
isSelected = !isSelected;
SizeChangedInfo sifo = new SizeChangedInfo(field, new Size(0, 0), true, true);
SizeChangedEventArgs ea = typeof(SizeChangedEventArgs)
.GetConstructors(System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)
.FirstOrDefault()
.Invoke(new object[] { (field as FrameworkElement), sifo }) as SizeChangedEventArgs;
ea.RoutedEvent = Canvas.SizeChangedEvent;
field.RaiseEvent(ea);
}
}
Ответы (1 шт):
Автор решения: aepot
→ Ссылка
Как я понял задача перекрасить клетку, в которую нажал юзер, тогда у меня вот так получилось.
<Window x:Class="ChessBoardHardcore.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:ChessBoardHardcore"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800" Loaded="Window_Loaded" SizeChanged="Window_SizeChanged" SnapsToDevicePixels="True">
<Grid x:Name="container">
<Canvas x:Name="canvas"></Canvas>
</Grid>
</Window>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
DrawBoard();
}
private void DrawBoard()
{
for (int i = 0; i < 8; i++)
for (int j = 0; j < 8; j++)
{
bool isLight = j % 2 == 0 ? i % 2 == 0 : i % 2 != 0;
Rectangle cell = new Rectangle
{
Fill = isLight ? Brushes.Bisque : Brushes.SandyBrown
};
cell.MouseLeftButtonDown += Cell_MouseClick;
cell.MouseLeftButtonUp += Cell_MouseClick;
cell.MouseLeave += Cell_MouseLeave;
canvas.Children.Add(cell);
}
ResizeBoard();
}
private void Cell_MouseLeave(object sender, MouseEventArgs e)
{
Rectangle cell = (Rectangle)sender;
if (cell.Fill == Brushes.RosyBrown)
cell.Fill = Brushes.Bisque;
else if (cell.Fill == Brushes.Brown)
cell.Fill = Brushes.SandyBrown;
}
private void Cell_MouseClick(object sender, MouseButtonEventArgs e)
{
Rectangle cell = (Rectangle)sender;
if (e.LeftButton == MouseButtonState.Pressed)
{
if (cell.Fill == Brushes.Bisque)
cell.Fill = Brushes.RosyBrown;
else if (cell.Fill == Brushes.SandyBrown)
cell.Fill = Brushes.Brown;
}
else
{
if (cell.Fill == Brushes.RosyBrown)
cell.Fill = Brushes.Bisque;
else if (cell.Fill == Brushes.Brown)
cell.Fill = Brushes.SandyBrown;
}
}
private void ResizeBoard()
{
if (canvas.Children.Count < 64)
return;
double size = Math.Min(container.ActualHeight, container.ActualWidth);
canvas.Width = size;
canvas.Height = size;
double cellSize = size / 8;
for (int i = 0; i < 8; i++)
for (int j = 0; j < 8; j++)
{
Rectangle cell = (Rectangle)canvas.Children[i * 8 + j];
cell.Width = cellSize;
cell.Height = cellSize;
Canvas.SetTop(cell, i * cellSize);
Canvas.SetLeft(cell, j * cellSize);
}
}
private void Window_SizeChanged(object sender, SizeChangedEventArgs e)
{
ResizeBoard();
}
}