单击一个充满网格的Uniformgrid,单击获得网格的名称

马丁

我是WPF的新手,我使用此代码在网格中填充了统一网格,

 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++
                    } 

即时通讯然后当我单击名为ChessBoard的统一网格时,试图找出某个网格的名称。

       private void ChessBoard_MouseLeftButtonDown(object sender, MouseButtonEventArgs args)
        {


            var element = (UIElement)args.Source;
            element.Opacity = 0.5; 
        }

测试不透明度线以确保im在正确的网格上,并且它可以工作并更改单击im时网格的不透明度。

我需要帮助的是找到元素的Name属性。

费德里科·贝拉萨特吉

好的,删除所有代码并重新开始。

如果您使用的是WPF,则确实需要了解并接受WPF的心态

通常,不建议在过程代码中创建或操作UI元素。相反,您将创建一个适当的ViewModel,该ViewModel将保存代表UI所显示的状态和数据的所有相关属性,并使用DataBinding反映这些属性。

这是您在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 partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        DataContext = new ChessBoard();
    }
}

ViewModel:

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; }}        
}

命令类(MVVM帮助程序类):

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;
    }
}

结果:

在此处输入图片说明

  • 尽管所有这些看起来都像是“太多的代码”,但是如果仔细观察,您会发现其中的大多数实际上是可重用的,干净的代码,并且与UI无关,并且我还将为您提供许多可重用的基础结构( (例如Command上课)。

  • 我使用的ItemsControl是数据项集合绑定,而不是按程序创建UI元素。这就是“让WPF发挥作用”。

  • 主要思想是将UI和逻辑分离,从而获得很多可伸缩性和可维护性。
  • 请注意,后面的代码如何简化为DataContext = ...WPF中的后面代码保留给UI特定代码,而不是与数据或逻辑相关的代码。
  • 我正在使用aDelegateCommand来处理Click逻辑,而不是事件处理程序。这在由ItemsControl等动态创建UI元素的情况下很有用。
  • 还要注意,该OnSquareClick()方法是如何针对您自己的简单的有状态数据项(ChessSquare)而不是复杂的WPF UI对象进行操作的。这就是您在WPF中编程的方式。您对数据而不是UI进行操作。
  • 还要注意针对属性使用DataTriggerIsBlack来动态更改背景颜色。
  • WPF岩石只需将我的代码复制并粘贴到中,File -> New Project -> WPF Application然后自己查看结果。
  • 我强烈建议您阅读所有链接的材料。让我知道您是否需要进一步的帮助。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

创建一个充满矩形的网格

来自分类Dev

WPF:如何在单击按钮时淡入网格,并在单击另一个按钮时淡出网格?

来自分类Dev

如何通过单击网格ExtJS 6中的一个单元格来选择一条记录

来自分类Dev

当单击网格视图时,如何将arralist(position)发送到另一个活动

来自分类Dev

WPF捕获单击一个网格及其所有子级标签,文本框等。

来自分类Dev

每次在网格视图中单击按钮或链接时如何打开另一个新的弹出窗口

来自分类Dev

单击编辑按钮,在EXTJS网格中编辑行,并打开一个用于编辑字段的新窗口

来自分类Dev

当单击网格视图时,如何将arralist(position)发送到另一个活动

来自分类Dev

单击时-给除当前项目以外的所有其他li项目提供一个类-网格

来自分类Dev

单击每个项目内的“x”按钮删除任何网格项目,我的方法只删除最后一个

来自分类Dev

一个以上的网格

来自分类Dev

一个以上的网格

来自分类Dev

使用GWT单击另一个表时,如何在一个数据网格中选择行?

来自分类Dev

角度UI网格单击行

来自分类Dev

剑道网格按钮单击参数

来自分类Dev

单击网格时,ArcRotateCamera专注于

来自分类Dev

单击按钮后显示网格

来自分类Dev

执行单击网格中的按钮

来自分类Dev

我如何获得一个数据模板来填充统一的网格单元?

来自分类Dev

单击一个对象

来自分类Dev

如何获得一个适合其内容旋转大小的容器(即网格)?

来自分类Dev

如何获得一个适合其内容旋转大小的容器(即网格)?

来自分类Dev

网格一个numpy数组

来自分类Dev

从网格绘制一个简单的圆

来自分类Dev

创建一个网格并分配值

来自分类Dev

网格一个numpy数组

来自分类Dev

建立一个流体镶嵌网格

来自分类Dev

链接相似名称类,以便在单击一个名称时给另一个名称类

来自分类Dev

单击链接一次显示网格,是否必须再次单击链接以在网格中显示数据?

Related 相关文章

  1. 1

    创建一个充满矩形的网格

  2. 2

    WPF:如何在单击按钮时淡入网格,并在单击另一个按钮时淡出网格?

  3. 3

    如何通过单击网格ExtJS 6中的一个单元格来选择一条记录

  4. 4

    当单击网格视图时,如何将arralist(position)发送到另一个活动

  5. 5

    WPF捕获单击一个网格及其所有子级标签,文本框等。

  6. 6

    每次在网格视图中单击按钮或链接时如何打开另一个新的弹出窗口

  7. 7

    单击编辑按钮,在EXTJS网格中编辑行,并打开一个用于编辑字段的新窗口

  8. 8

    当单击网格视图时,如何将arralist(position)发送到另一个活动

  9. 9

    单击时-给除当前项目以外的所有其他li项目提供一个类-网格

  10. 10

    单击每个项目内的“x”按钮删除任何网格项目,我的方法只删除最后一个

  11. 11

    一个以上的网格

  12. 12

    一个以上的网格

  13. 13

    使用GWT单击另一个表时,如何在一个数据网格中选择行?

  14. 14

    角度UI网格单击行

  15. 15

    剑道网格按钮单击参数

  16. 16

    单击网格时,ArcRotateCamera专注于

  17. 17

    单击按钮后显示网格

  18. 18

    执行单击网格中的按钮

  19. 19

    我如何获得一个数据模板来填充统一的网格单元?

  20. 20

    单击一个对象

  21. 21

    如何获得一个适合其内容旋转大小的容器(即网格)?

  22. 22

    如何获得一个适合其内容旋转大小的容器(即网格)?

  23. 23

    网格一个numpy数组

  24. 24

    从网格绘制一个简单的圆

  25. 25

    创建一个网格并分配值

  26. 26

    网格一个numpy数组

  27. 27

    建立一个流体镶嵌网格

  28. 28

    链接相似名称类,以便在单击一个名称时给另一个名称类

  29. 29

    单击链接一次显示网格,是否必须再次单击链接以在网格中显示数据?

热门标签

归档