【发布时间】:2018-07-22 18:18:48
【问题描述】:
我想创建一个自定义用户控件,其中包含两个相互嵌套的网格:
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
...
public class VGrid : Grid
{
public VGrid()
{
RowDefinitions.Add(new RowDefinition()
{ Height = GridLength.Auto });
RowDefinitions.Add(new RowDefinition()
{ Height = new GridLength(1, GridUnitType.Star) });
RowDefinitions.Add(new RowDefinition()
{ Height = GridLength.Auto });
}
}
public class HGrid : Grid
{
public HGrid()
{
ColumnDefinitions.Add(new ColumnDefinition()
{ Width = GridLength.Auto });
ColumnDefinitions.Add(new ColumnDefinition()
{ Width = new GridLength(1, GridUnitType.Star)});
ColumnDefinitions.Add(new ColumnDefinition()
{ Width = GridLength.Auto });
}
}
这就是我卡住的地方...如何为每一行创建自定义属性,内部和外部网格的列为相应的子项分配网格的行/列的正确附加属性。
public class NineGrid : HGrid
{
VGrid inner0;
VGrid inner1;
VGrid inner2;
public NineGrid()
{
inner1 = new VGrid();
inner2 = new VGrid();
inner3 = new VGrid();
this.Children.Add(inner1);
this.Children.Add(inner2);
this.Children.Add(inner3);
}
}
但是,这就是我想要的样子:
<local:NineGrid>
<!-- First Row: Toolbar + Hamburger Button -->
<local:NineGrid.XY_0_0><Button Content="0,0"/><local:NineGrid.XY_0_0>
<local:NineGrid.XY_0_1><Button Content="0,1"/><local:NineGrid.XY_0_1>
<local:NineGrid.XY_0_2><Button Content="0,2"/><local:NineGrid.XY_0_2>
<!-- Second Row: ContentPage + Left and Right Side Menus -->
<local:NineGrid.XY_1_0><Frame Name="AFrame0"/><local:NineGrid.XY_1_0>
<local:NineGrid.XY_1_1><Frame Name="AFrame1"/><local:NineGrid.XY_1_1>
<local:NineGrid.XY_1_2><Frame Name="AFrame2"/><local:NineGrid.XY_1_2>
<!-- Third Row: Status Bar + Misc + Settings Button -->
<local:NineGrid.XY_2_0><Button Content="2,0"/><local:NineGrid.XY_2_0>
<local:NineGrid.XY_2_1><Button Content="2,1"/><local:NineGrid.XY_2_1>
<local:NineGrid.XY_2_2><Button Content="2,2"/><local:NineGrid.XY_2_2>
</local:NineGrid>
在 XAML 示例中使用按钮是我将如何使用此自定义控件的玩具示例。
真正的场景是第一行,一个带有左右控件的命令栏,根据窗口或菜单状态的大小出现和消失,第二行带有左右弹出菜单的中心内容,最后一行带有状态行。
有可能吗?如果您将两个网格相互嵌套,然后在其中放入更多还包含网格的内容,那么普通的 XAML 代码就会变得混乱。所以我的想法是创建一个自定义控件,将两个顶级嵌套网格展平成对于我需要的 95% 的情况,一个已经按照我想要的方式设置的控件。问题是如何使用 XAML 填充嵌套网格的自定义控件。
【问题讨论】:
-
为什么不使用具有 3 行 和 3 列的单个 Grid?也就是说,很明显,通过嵌套,您要么需要 1 个外部 VGrid 和 3 个内部 HGrid,要么需要 1 个 HGrid 和 3 个 VGrid。
-
ContentPropertyAttribute Class docs.microsoft.com/en-us/uwp/api/… 我在想它应该是一个继承自网格的类,然后在构造函数中创建一个新的网格并将其分配给this.grid的Child,然后执行使用 ContentPropertAttribute 来分配新网格的 children 属性的内部网格而不是外部网格的默认子网格的一些魔法
-
这是你会反复重复使用的东西吗?还是只有一页?
-
每页至少使用一次。但是,将 NineGrid 嵌套在 NineGrid 的一个单元中可能会很有趣......
-
@BillMoore 除了 NineGrid 之外,您还需要 HGrid 和 VGrid 吗?