C# 单击填充有网格的Uniformgrid,获取网格的名称

C# 单击填充有网格的Uniformgrid,获取网格的名称,c#,wpf,uniformgrid,C#,Wpf,Uniformgrid,我是WPF新手,我使用此代码用网格填充uniformgrid public MainWindow() { InitializeComponent(); SolidColorBrush defaultBrush = new SolidColorBrush(Colors.Wheat); SolidColorBrush alterna

我是WPF新手,我使用此代码用网格填充uniformgrid

 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和逻辑,从而获得大量的可伸缩性和可维护性
  • 请注意,代码隐藏是如何简化为一个纯粹的
    DataContext=…
    。WPF中的代码隐藏是为特定于用户界面的代码保留的,而不是与数据或逻辑相关的代码
  • 我使用的是一个函数来处理点击逻辑,而不是一个事件处理程序。这在UI元素由ItemsControl等动态创建的情况下非常有用
  • 还要注意
    OnSquareClick()
    方法是如何针对您自己的简单、有状态的数据项(
    ChessSquare
    )而不是复杂的神秘WPF UI对象运行的。这就是在WPF中编程的方式。您根据数据而不是用户界面进行操作
  • 还请注意,在
    IsBlack
    属性中使用了一个属性来动态更改背景色
  • WPF岩石。只需将我的代码复制并粘贴到
    文件->新项目->WPF应用程序中
    ,然后自己查看结果
  • 我强烈建议您阅读所有链接材料。如果你需要进一步的帮助,请告诉我

非常感谢您的回复!我会看一看,从头开始!经过一些阅读,现在我已经很好地掌握了这一点,到目前为止,我唯一的问题是命令,我已经阅读了你给我的DelegateCommand链接,并观看了一些youtube指南,但你给我看的命令仍然存在问题。我是否必须以某种方式定义ICommand,或者在您的示例中它是如何工作的?@Martin接口是在
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;
    }
}