【问题标题】:Silverlight Layout Grid Child ControlsSilverlight 布局网格子控件
【发布时间】:2011-04-22 19:03:05
【问题描述】:

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

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

 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”控件是一个 Button 控件。 “s”是一个自定义控件,用于保存网格内按钮的坐标。执行该代码时,我没有返回任何对象。有什么想法可以让我更好地执行此操作吗?

【问题讨论】:

    标签: c# silverlight


    【解决方案1】:

    简答:

    必须要有创意(见下文)。由于附加属性的工作方式,这基本上是唯一的方法。

    一边

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

    完整答案:是

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

    • 设置标准Grid.SetRow(或列)
    • 将您的控件添加到字典中,以行、列为键。即:创建您自己的具有RowColumn 的类,实现EqualsGetHashCode,因此您可以这样做:

      字典 _buttons = new Dictionary();

      OnChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e) { // 剪断 _dict.Add(new GridKey(row, column), button); }

    那么你的查找变成了 O(1) 操作而不是 O(n)

    如果您不想使用附加属性路线,您可以在动态生成网格时简单地执行 _dict.Add 操作。 (当你这样做时rowGrid.Children.Add(..)

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

    【讨论】:

    • 这能回答你的问题吗?
    猜你喜欢
    • 2011-11-29
    • 1970-01-01
    • 1970-01-01
    • 2013-05-23
    • 2010-12-14
    • 2011-10-28
    • 2013-04-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多