一旦知道了行和列,如何在网格中更改UI控件的属性

本文关键字:网格 UI 属性 控件 | 更新日期: 2023-09-27 18:14:19

我在访问网格内安排的UI控件(在我的情况下:标签和矩形)时遇到了麻烦。我需要在网格中的特定位置访问此控件(给定行和列号),并需要更改其背景颜色,字体大小等。

到目前为止,我使用的代码看起来像这样:
foreach (UIElement ui in myGrid.Children)
{
     int rowIndex = System.Windows.Controls.Grid.GetRow(ui);
     int colIndex = System.Windows.Controls.Grid.GetColumn(ui);
     if (rowIndex == TargetRow && colIndex == TargetCol)
           //change the background property of the ui control to yellow
}

If语句是我被难住的地方(假设其余代码也是正确的)。我如何使用这个ui元素的属性?请帮助!

一旦知道了行和列,如何在网格中更改UI控件的属性

您可以为标签设置Control.Background或为矩形设置Shape.Fill:

if (rowIndex == TargetRow && colIndex == TargetCol)
{
    if (ui is Control)
    {
        ((Control)ui).Background = Brushes.Yellow;
    }
    else if (ui is Shape)
    {
        ((Shape)ui).Fill = Brushes.Yellow;
    }
}

不需要显式地遍历所有子元素,您可以使用LINQ查找匹配的元素,如下所示:

using System.Linq;
...
var ui = myGrid.Children.Cast<UIElement>().FirstOrDefault(
    c => Grid.GetColumn(c) == TargetCol && Grid.GetRow(c) == TargetRow);
if (ui is Control)
...

必须将元素强制转换为适当的类型。您可能想尝试转换到包含您正在寻找的属性的类层次结构中的最低元素—对于Background,这将是Control:

if (rowIndex == TargetRow && colIndex == TargetCol)
{ 
    //change the background property of the ui control to yellow
    if (ui is Control)
        ((Control)ui).Background = Brushes.Yellow;
}

你也可以使用linq风格的迭代器:

foreach (var control in myGrid.Children.OfType<Control>()
    .Where(child => Grid.GetRow(child) == TargetRow && Grid.GetColumn(child) == TargetCol)
{
    control.Background = Brushes.Yellow;
}