C# 单击填充有网格的Uniformgrid,获取网格的名称
我是WPF新手,我使用此代码用网格填充uniformgridC# 单击填充有网格的Uniformgrid,获取网格的名称,c#,wpf,uniformgrid,C#,Wpf,Uniformgrid,我是WPF新手,我使用此代码用网格填充uniformgrid public MainWindow() { InitializeComponent(); SolidColorBrush defaultBrush = new SolidColorBrush(Colors.Wheat); SolidColorBrush alterna
public MainWindow()
{
InitializeComponent();
SolidColorBrush defaultBrush = new SolidColorBrush(Colors.Wheat);
SolidColorBrush alternateBrush = new SolidColorBrush(Colors.Black);
Char L = 'A';
int N = 1;
for (int i = 0; i < 64; i++)
{
Grid cell = new Grid();
if(N==9)
{
N=1;
L++;
}
if ((i + i / 8) % 2 == 0)
{
cell.Name = L + N.ToString();
cell.Background = defaultBrush;
ChessBoard.Children.Add(cell);
}
else
{
cell.Name = L + N.ToString();
cell.Background = alternateBrush;
ChessBoard.Children.Add(cell);
}
N++
}
不透明度线是测试,以确保即时消息在正确的网格上,它可以工作并更改即时消息单击网格的不透明度
我需要的帮助是找到元素的Name属性。好的,删除所有代码并重新开始 如果你在使用WPF,你真的需要理解和接受它 一般来说,不鼓励在过程代码中创建或操作UI元素。 相反,您将创建一个适当的属性,该属性将保存表示UI所显示的状态和数据的所有相关属性,并用于反映这些属性 以下是您在WPF中尝试的方法:
<Window x:Class="ChessBoardSample.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="350">
<ItemsControl ItemsSource="{Binding Squares}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<UniformGrid Rows="8" Columns="8"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Button x:Name="Square"
Command="{Binding DataContext.SquareClickCommand, RelativeSource={RelativeSource AncestorType=ItemsControl}}"
CommandParameter="{Binding}">
<Button.Template>
<ControlTemplate TargetType="Button">
<Grid Background="{TemplateBinding Background}"/>
</ControlTemplate>
</Button.Template>
</Button>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding IsBlack}" Value="True">
<Setter TargetName="Square" Property="Background" Value="Black"/>
</DataTrigger>
<DataTrigger Binding="{Binding IsBlack}" Value="False">
<Setter TargetName="Square" Property="Background" Value="Wheat"/>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Window>
视图模型:
public class ChessBoard
{
public List<ChessSquare> Squares { get; private set; }
public Command<ChessSquare> SquareClickCommand { get; private set; }
public ChessBoard()
{
Squares = new List<ChessSquare>();
for (int i = 0; i < 8; i++)
{
for (int j = 0; j < 8; j++)
{
Squares.Add(new ChessSquare() {Row = i, Column = j});
}
}
SquareClickCommand = new Command<ChessSquare>(OnSquareClick);
}
private void OnSquareClick(ChessSquare square)
{
MessageBox.Show("You clicked on Row: " + square.Row + " - Column: " + square.Column);
}
}
命令类(MVVM帮助程序类):
公共类命令:ICommand
{
公共操作动作{get;set;}
public void Execute(对象参数)
{
if(Action!=null&&参数为T)
作用((T)参数);
}
公共布尔CanExecute(对象参数)
{
返回被禁止;
}
private bool _isEnabled=true;
公共场所被禁止
{
获取{return}
设置
{
_isEnabled=值;
如果(CanExecuteChanged!=null)
CanExecuteChanged(此为EventArgs.Empty);
}
}
公共事件处理程序CanExecuteChanged;
公共命令(行动)
{
行动=行动;
}
}
结果:
- 虽然所有这些看起来像是“太多的代码”,但如果仔细观察,您会发现大部分代码实际上是可重用的、干净的代码,不依赖于UI,而且我还为您提供了许多可重用的基础结构(例如
类)命令
- 我使用数据项集合的绑定,而不是按程序创建UI元素。这是“让WPF做它的工作”
- 其主要思想是分离UI和逻辑,从而获得大量的可伸缩性和可维护性
- 请注意,代码隐藏是如何简化为一个纯粹的
。WPF中的代码隐藏是为特定于用户界面的代码保留的,而不是与数据或逻辑相关的代码DataContext=…
- 我使用的是一个函数来处理点击逻辑,而不是一个事件处理程序。这在UI元素由ItemsControl等动态创建的情况下非常有用
- 还要注意
方法是如何针对您自己的简单、有状态的数据项(OnSquareClick()
)而不是复杂的神秘WPF UI对象运行的。这就是在WPF中编程的方式。您根据数据而不是用户界面进行操作ChessSquare
- 还请注意,在
属性中使用了一个属性来动态更改背景色IsBlack
- WPF岩石。只需将我的代码复制并粘贴到
,然后自己查看结果文件->新项目->WPF应用程序中
- 我强烈建议您阅读所有链接材料。如果你需要进一步的帮助,请告诉我
System.Windows.Input
中定义的。
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext = new ChessBoard();
}
}
public class ChessBoard
{
public List<ChessSquare> Squares { get; private set; }
public Command<ChessSquare> SquareClickCommand { get; private set; }
public ChessBoard()
{
Squares = new List<ChessSquare>();
for (int i = 0; i < 8; i++)
{
for (int j = 0; j < 8; j++)
{
Squares.Add(new ChessSquare() {Row = i, Column = j});
}
}
SquareClickCommand = new Command<ChessSquare>(OnSquareClick);
}
private void OnSquareClick(ChessSquare square)
{
MessageBox.Show("You clicked on Row: " + square.Row + " - Column: " + square.Column);
}
}
public class ChessSquare
{
public int Row { get; set; }
public int Column { get; set; }
public bool IsBlack { get { return (Row + Column) %2 == 1; }}
}
public class Command<T>: ICommand
{
public Action<T> Action { get; set; }
public void Execute(object parameter)
{
if (Action != null && parameter is T)
Action((T)parameter);
}
public bool CanExecute(object parameter)
{
return IsEnabled;
}
private bool _isEnabled = true;
public bool IsEnabled
{
get { return _isEnabled; }
set
{
_isEnabled = value;
if (CanExecuteChanged != null)
CanExecuteChanged(this, EventArgs.Empty);
}
}
public event EventHandler CanExecuteChanged;
public Command(Action<T> action)
{
Action = action;
}
}