在 WPF 上绘制武士数独网格
Draw samurai sudoku grid on WPF
我想在我的 C# WPF 项目中绘制一个武士数独网格。
这是武士数独的例子
对于网格中的每个文本框,我想用 txt 文件中的动态值加载它。
txt 文件:“23987239847239847”(总共 405 个整数)
我已经有了正常的数独网格
代码:
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<UniformGrid Rows="{Binding Dimension}" Columns="{Binding Dimension}" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBox HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Text="{Binding Value, Mode=TwoWay}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
绘制看起来像武士所库网格的网格的最有效方法是什么?
演示示例。
它并不像问题中的图片那么困难。
不过你补充一下就没有问题了
public class SudokuCell
{
public Thickness Border { get; }
public int Value { get; set; }
public int Row { get; }
public int Column { get; }
public SudokuCell(int row, int column, Thickness border)
{
Row = row;
Column = column;
Border = border;
}
public SudokuCell(int row, int column, Thickness border, int value)
: this(row, column, border)
{
Value = value;
}
}
public class SudokuViewModel
{
public ObservableCollection<SudokuCell> Cells { get; }
= new ObservableCollection<SudokuCell>();
public IEnumerable<int> ValidValues { get; } = Enumerable.Range(1, 9);
private readonly SudokuCell[,] cellsArray;
private static readonly Random random = new Random();
public SudokuViewModel()
{
cellsArray = new SudokuCell[9, 9];
for (int row = 0; row < 9; row++)
{
for (int column = 0; column < 9; column++)
{
if ((row / 3 + column / 3) % 2 == 1)
continue;
double left = 0.5;
if (column % 3 == 0)
left = 3;
double top = 0.5;
if (row % 3 == 0)
top = 3;
double right = 0.5;
if (column % 3 == 2)
right = 3;
double bottom = 0.5;
if (row % 3 == 2)
bottom = 3;
int value = 0;
if (random.Next(5) < 2)
value = random.Next(9) + 1;
cellsArray[row, column] = new SudokuCell(
row,
column,
new Thickness(left, top, right, bottom),
value);
}
}
foreach (var cell in cellsArray)
{
Cells.Add(cell);
}
}
}
<Window.Resources>
<local:SudokuViewModel x:Key="viewModel"/>
<ItemsPanelTemplate x:Key="Sudoku.Panel">
<UniformGrid Columns="9" Rows="9"/>
</ItemsPanelTemplate>
<DataTemplate x:Key="Sudoku.CellTemplate" DataType="{x:Type local:SudokuCell}">
<Border BorderBrush="SkyBlue" BorderThickness="{Binding Border}"
Background="{Binding Background, ElementName=comboBox}">
<Border.Style>
<Style>
<Style.Triggers>
<DataTrigger Binding="{Binding}" Value="{x:Null}">
<Setter Property="Border.Opacity" Value="0"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Border.Style>
<ComboBox x:Name="comboBox" ItemsSource="{Binding ValidValues, Source={StaticResource viewModel}}"
SelectedItem="{Binding Value}"
FontSize="20" VerticalAlignment="Center" HorizontalAlignment="Center"
BorderThickness="0"/>
</Border>
</DataTemplate>
</Window.Resources>
<ItemsControl ItemsSource="{Binding Cells, Source={StaticResource viewModel}}"
ItemTemplate="{DynamicResource Sudoku.CellTemplate}"
ItemsPanel="{DynamicResource Sudoku.Panel}"/>
我想在我的 C# WPF 项目中绘制一个武士数独网格。 这是武士数独的例子
对于网格中的每个文本框,我想用 txt 文件中的动态值加载它。
txt 文件:“23987239847239847”(总共 405 个整数)
我已经有了正常的数独网格
代码:
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<UniformGrid Rows="{Binding Dimension}" Columns="{Binding Dimension}" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBox HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Text="{Binding Value, Mode=TwoWay}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
绘制看起来像武士所库网格的网格的最有效方法是什么?
演示示例。 它并不像问题中的图片那么困难。 不过你补充一下就没有问题了
public class SudokuCell
{
public Thickness Border { get; }
public int Value { get; set; }
public int Row { get; }
public int Column { get; }
public SudokuCell(int row, int column, Thickness border)
{
Row = row;
Column = column;
Border = border;
}
public SudokuCell(int row, int column, Thickness border, int value)
: this(row, column, border)
{
Value = value;
}
}
public class SudokuViewModel
{
public ObservableCollection<SudokuCell> Cells { get; }
= new ObservableCollection<SudokuCell>();
public IEnumerable<int> ValidValues { get; } = Enumerable.Range(1, 9);
private readonly SudokuCell[,] cellsArray;
private static readonly Random random = new Random();
public SudokuViewModel()
{
cellsArray = new SudokuCell[9, 9];
for (int row = 0; row < 9; row++)
{
for (int column = 0; column < 9; column++)
{
if ((row / 3 + column / 3) % 2 == 1)
continue;
double left = 0.5;
if (column % 3 == 0)
left = 3;
double top = 0.5;
if (row % 3 == 0)
top = 3;
double right = 0.5;
if (column % 3 == 2)
right = 3;
double bottom = 0.5;
if (row % 3 == 2)
bottom = 3;
int value = 0;
if (random.Next(5) < 2)
value = random.Next(9) + 1;
cellsArray[row, column] = new SudokuCell(
row,
column,
new Thickness(left, top, right, bottom),
value);
}
}
foreach (var cell in cellsArray)
{
Cells.Add(cell);
}
}
}
<Window.Resources>
<local:SudokuViewModel x:Key="viewModel"/>
<ItemsPanelTemplate x:Key="Sudoku.Panel">
<UniformGrid Columns="9" Rows="9"/>
</ItemsPanelTemplate>
<DataTemplate x:Key="Sudoku.CellTemplate" DataType="{x:Type local:SudokuCell}">
<Border BorderBrush="SkyBlue" BorderThickness="{Binding Border}"
Background="{Binding Background, ElementName=comboBox}">
<Border.Style>
<Style>
<Style.Triggers>
<DataTrigger Binding="{Binding}" Value="{x:Null}">
<Setter Property="Border.Opacity" Value="0"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Border.Style>
<ComboBox x:Name="comboBox" ItemsSource="{Binding ValidValues, Source={StaticResource viewModel}}"
SelectedItem="{Binding Value}"
FontSize="20" VerticalAlignment="Center" HorizontalAlignment="Center"
BorderThickness="0"/>
</Border>
</DataTemplate>
</Window.Resources>
<ItemsControl ItemsSource="{Binding Cells, Source={StaticResource viewModel}}"
ItemTemplate="{DynamicResource Sudoku.CellTemplate}"
ItemsPanel="{DynamicResource Sudoku.Panel}"/>