3 回答

TA貢獻1995條經(jīng)驗 獲得超2個贊
由于所有單元格都應(yīng)具有相同的大小,因此您也可以使用UniformGrid。正如 Leo Bartkus 建議的那樣,您可以使用代碼隱藏來生成單元格和文本框。為此,首先在 XAML 中為數(shù)獨表創(chuàng)建一個占位符:
<!-- Placeholder for Sudoku table (filled in code-behind) -->
<Border x:Name="SudokuTable" />
假設(shè)您使用的是Window,這是代碼隱藏:
public partial class MainWindow : Window
{
private const int InnerWidth = 3;
private const int OuterWidth = InnerWidth * InnerWidth;
private const int Thin = 1;
private const int Thick = 3;
public MainWindow()
{
InitializeComponent();
InitializeViewModel();
InitializeSudokuTable();
}
public SudokuViewModel ViewModel => (SudokuViewModel)DataContext;
private void InitializeViewModel()
{
DataContext = new SudokuViewModel(OuterWidth);
}
private void InitializeSudokuTable()
{
var grid = new UniformGrid
{
Rows = OuterWidth,
Columns = OuterWidth
};
for (var i = 0; i < OuterWidth; i++)
{
for (var j = 0; j < OuterWidth; j++)
{
var border = CreateBorder(i, j);
border.Child = CreateTextBox(i, j);
grid.Children.Add(border);
}
}
SudokuTable.Child = grid;
}
private static Border CreateBorder(int i, int j)
{
var left = j % InnerWidth == 0 ? Thick : Thin;
var top = i % InnerWidth == 0 ? Thick : Thin;
var right = j == OuterWidth - 1 ? Thick : 0;
var bottom = i == OuterWidth - 1 ? Thick : 0;
return new Border
{
BorderThickness = new Thickness(left, top, right, bottom),
BorderBrush = Brushes.Black
};
}
private TextBox CreateTextBox(int i, int j)
{
var textBox = new TextBox
{
VerticalAlignment = VerticalAlignment.Center,
HorizontalAlignment = HorizontalAlignment.Center
};
var binding = new Binding
{
Source = ViewModel,
Path = new PropertyPath($"[{i},{j}]"),
Mode = BindingMode.TwoWay
};
textBox.SetBinding(TextBox.TextProperty, binding);
return textBox;
}
}
嵌套循環(huán)為 81 個單元創(chuàng)建每個Border和TextBox。邊框的粗細是根據(jù)當(dāng)前單元格的位置確定的。這將為您提供典型的數(shù)獨表外觀。
文本框數(shù)據(jù)綁定到視圖模型的二維索引器屬性。這是視圖模型:
public class SudokuViewModel : ViewModelBase
{
private readonly string[,] _values;
public SudokuViewModel(int width)
{
_values = new string[width, width];
}
public string this[int i, int j]
{
get => _values[i, j];
set => Set(ref _values[i, j], value);
}
}
此索引器返回一個字符串,但您可能希望將其更改為整數(shù)并進行適當(dāng)?shù)霓D(zhuǎn)換和錯誤檢查。PropertyChanged在任何情況下,它都使用 MVVM Light在索引器屬性更新時引發(fā)事件。
我在這里用我的解決方案創(chuàng)建了一個存儲庫:https ://github.com/redcurry/Sudoku 。

TA貢獻1936條經(jīng)驗 獲得超7個贊
每個人的答案都很好,你的想法讓我專注于一個目標(biāo):)
到目前為止,這就是我所在的位置。
XAML:我正在使用詳細的 XAML 方法和網(wǎng)格。
網(wǎng)格:11x11 -(數(shù)獨單元格為 9x9 + 邊框為 2x2)。
<Grid Grid.Row="1" >
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition Width="2px"/>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition Width="2px"/>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
<RowDefinition Height="2px"/>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
<RowDefinition Height="2px"/>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Rectangle Grid.Row="0" Grid.Column="3" Grid.RowSpan="11" Fill="Black"></Rectangle>
<Rectangle Grid.Row="0" Grid.Column="7" Grid.RowSpan="11" Fill="Black"></Rectangle>
<Rectangle Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="11" Fill="Black"></Rectangle>
<Rectangle Grid.Row="7" Grid.Column="0" Grid.ColumnSpan="11" Fill="Black"></Rectangle>
<local:CellUserControl Grid.Row="0" Grid.Column="0" DataContext="{Binding Path=Cells[0], Source={StaticResource Locator}}"/>
<local:CellUserControl Grid.Row="0" Grid.Column="1" DataContext="{Binding Path=Cells[1], Source={StaticResource Locator}}"/>
...
我很懶,所以我最終使用 Excel 電子表格來枚舉 81 個單元格,并使用 Floor.Math、MOD 和 Concatenate 的組合 :)
下一個挑戰(zhàn)是將 81 MVVM 屬性重構(gòu)為更微不足道的東西。在 XAML 中:語法為 {Binding Path=Cells[0]} 并選擇(暫時)將屬性放在 ViewModelLocator 中。
public IList<CellViewModel> Cells
{
get
{
return new List<CellViewModel>(ServiceLocator.Current.GetAllInstances<CellViewModel>());
}
}
XAML 和代碼是干凈的。我喜歡它,到目前為止。我仍在處理 IList 的正確位置 - 它應(yīng)該保留在 ViewModelLocator 中還是應(yīng)該實際上在 MainViewModel 中?我想,要回答這個問題,我必須做一些單元測試。

TA貢獻1834條經(jīng)驗 獲得超8個贊
這是我如何用網(wǎng)格做數(shù)獨的一個例子......
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
<RowDefinition Height="5"/>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
<RowDefinition Height="5"/>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="5"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="5"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBox x:Name="textBox00" TextWrapping="Wrap" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Text="1"/>
<TextBox x:Name="textBox00_Copy" TextWrapping="Wrap" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Text="1" Grid.Column="1"/>
<TextBox x:Name="textBox00_Copy1" TextWrapping="Wrap" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Text="1" Grid.Column="2"/>
<TextBox x:Name="textBox00_Copy2" TextWrapping="Wrap" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Text="1" Grid.Column="4"/>
<TextBox x:Name="textBox00_Copy3" TextWrapping="Wrap" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Text="1" Grid.Column="5"/>
<TextBox x:Name="textBox00_Copy4" TextWrapping="Wrap" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Text="1" Grid.Column="6"/>
<TextBox x:Name="textBox00_Copy5" TextWrapping="Wrap" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Text="1" Grid.Column="2" Grid.Row="1"/>
<TextBox x:Name="textBox00_Copy6" TextWrapping="Wrap" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Text="1" Grid.Column="4" Grid.Row="1"/>
<TextBox x:Name="textBox00_Copy7" TextWrapping="Wrap" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Text="1" Grid.Column="5" Grid.Row="1"/>
<TextBox x:Name="textBox00_Copy8" TextWrapping="Wrap" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Text="1" Grid.Column="1" Grid.Row="1"/>
<TextBox x:Name="textBox00_Copy9" TextWrapping="Wrap" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Text="1" Grid.Column="1" Grid.Row="2"/>
<TextBox x:Name="textBox00_Copy10" TextWrapping="Wrap" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Text="1" Grid.Column="2" Grid.Row="2"/>
<TextBox x:Name="textBox00_Copy11" TextWrapping="Wrap" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Text="1" Grid.Column="4" Grid.Row="2"/>
<Rectangle Grid.Column="3" Fill="#FF663003" Grid.RowSpan="12"/>
<Rectangle Grid.Column="7" Fill="#FF663003" Grid.RowSpan="12"/>
<Rectangle Grid.Row="3" Fill="#FF663003" Grid.ColumnSpan="12"/>
<Rectangle Grid.Row="7" Fill="#FF663003" Grid.ColumnSpan="12"/>
這只是默認的文本框樣式。您可以使用用戶控件使其不同,或者您可以通過在 Blend for Visual Studio 中加載 xaml 來為文本框制作自定義樣式,右鍵單擊文本框并選擇編輯模板.. -> 編輯副本
- 3 回答
- 0 關(guān)注
- 137 瀏覽
添加回答
舉報