C# Silverlight布局网格子控件

C# Silverlight布局网格子控件,c#,silverlight,C#,Silverlight,我试图设置布局网格内按钮的属性。网格本身是动态生成的,网格单元内的按钮也是动态生成的。不幸的是,我无法在代码中按名称引用任何内容 我需要根据它们所在的网格单元来引用这些按钮。我尝试使用以下代码 stackButton = (Button) (from buttons in rowGrid.Children where Grid.GetColumn (buttons as FrameworkElement) == s.RoomCol

我试图设置布局网格内按钮的属性。网格本身是动态生成的,网格单元内的按钮也是动态生成的。不幸的是,我无法在代码中按名称引用任何内容

我需要根据它们所在的网格单元来引用这些按钮。我尝试使用以下代码

 stackButton = (Button) (from buttons in rowGrid.Children
                          where Grid.GetColumn (buttons as FrameworkElement) == s.RoomCol
                          where Grid.GetRow (buttons as FrameworkElement) == s.RoomRow
                          select buttons).FirstOrDefault();

“stackButton”控件是一个按钮控件。“s”是一个自定义控件,用于保存网格中按钮的坐标。当代码执行时,我没有得到任何返回的对象。有没有办法让我更好地执行这项任务

简短回答:

没有创造性(见下文)。这基本上是唯一的方法,因为附加属性是如何工作的

旁白

但有两件事。。。在文体上,您可以使用where子句,而不是两个where子句&& 从技术上讲,您可以让两个控件共享同一行/列(在这种情况下,它们是重叠的,因此您可能需要重新考虑“firstordefault”

完整答案:是

如果你想变得超级聪明,你可以注册你自己附加的依赖属性,比如:
Grid.MyRow
Grid.MyColumn
,并给它们一个
OnChanged
处理程序,它将:

  • 设置标准网格。设置行(或列)
  • 将控件添加到字典中,并键入行、列。即:创建自己的类,该类具有
    ,实现
    等于
    GetHashCode
    ,因此可以执行以下操作:

    字典按钮=新建字典()

    一旦更改(DependencyObject对象、DependencyPropertyChangedEventArgs e) { //剪断 _添加(新网格键(行、列)、按钮); }

然后,您的查找将变成一个O(1)操作,而不是O(n)

如果您不想执行附加属性路径,则只需在动态生成网格时执行_dict.Add操作即可。(执行
rowGrid.Children.Add(…)


如果您不能这样做,那么您可以有一个方法,该方法遍历子项一次并将它们全部添加到字典中,以便进一步查找O(1)

简短回答:

这是唯一的方法,因为附加属性是如何工作的

旁白

但有两件事……从风格上来说,你可以使用where子句,而不是where子句&& 从技术上讲,您可以让两个控件共享同一行/列(在这种情况下,它们是重叠的,因此您可能需要重新考虑“firstordefault”

完整答案:是

如果你想变得超级聪明,你可以注册你自己附加的依赖属性,比如:
Grid.MyRow
Grid.MyColumn
,并给它们一个
OnChanged
处理程序,它将:

  • 设置标准网格。设置行(或列)
  • 将控件添加到字典中,并键入行、列。即:创建自己的类,该类具有
    ,实现
    等于
    GetHashCode
    ,因此可以执行以下操作:

    字典按钮=新建字典()

    一旦更改(DependencyObject对象、DependencyPropertyChangedEventArgs e) { //剪断 _添加(新网格键(行、列)、按钮); }

然后,您的查找将变成一个O(1)操作,而不是O(n)

如果您不想执行附加属性路径,则只需在动态生成网格时执行_dict.Add操作即可。(执行
rowGrid.Children.Add(…)


如果你不能做到这一点,那么你可以有一个方法,在子类中迭代一次,并将它们全部添加到字典中,以便进一步查找O(1)

这能回答你的问题吗?这能回答你的问题吗?