Wpf 包含嵌套网格的UserControl,并公开嵌套网格的内容属性
我想创建一个自定义usercontrol,其中包含两个嵌套在彼此内部的网格:Wpf 包含嵌套网格的UserControl,并公开嵌套网格的内容属性,wpf,xaml,uwp,Wpf,Xaml,Uwp,我想创建一个自定义usercontrol,其中包含两个嵌套在彼此内部的网格: using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; ... public class VGrid : Grid { public VGrid() { RowDefinitions.Add(new RowDefinition() { Height = GridLength.Auto }); Row
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填充嵌套网格的自定义控件。我能想到的最好办法就是嵌套VGrid和HGrid,而忘记合并它们:
<Page
x:Class="junk6.BlankPage2"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:junk6"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<Page.Resources>
<Style TargetType="Button">
<Setter Property="BorderBrush" Value="Black"/>
<Setter Property="BorderThickness" Value="2"/>
<Setter Property="Margin" Value="2"/>
</Style>
</Page.Resources>
<local:VGrid>
<local:HGrid Grid.Row="0">
<Button Grid.Column="0" Content="Button0"/>
<Button Grid.Column="1" Content="Button1"
HorizontalAlignment="Stretch"/>
<Button Grid.Column="2" Content="Button2"/>
</local:HGrid>
<local:HGrid Grid.Row="1">
<Button Grid.Column="0" Content="Buttonc0"
VerticalAlignment="Stretch"/>
<Button Grid.Column="1" Content="Buttonc1"
VerticalAlignment="Stretch" HorizontalAlignment="Stretch"/>
<Button Grid.Column="2" Content="Buttonc2"
VerticalAlignment="Stretch"/>
</local:HGrid>
<local:HGrid Grid.Row="2">
<Button Grid.Column="0" Content="Button0"/>
<Button Grid.Column="1" Content="Button1"
HorizontalAlignment="Stretch"/>
<Button Grid.Column="2" Content="Button2"/>
</local:HGrid>
</local:VGrid>
</Page>
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
namespace junk6
{
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 });
}
}
}
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
使用Windows.UI.Xaml;
使用Windows.UI.Xaml.Controls;
命名空间垃圾6
{
公共类VGrid:Grid
{
公共VGrid()
{
添加(新的行定义()
{Height=GridLength.Auto});
添加(新的行定义()
{Height=新的GridLength(1,GridUnitType.Star)});
添加(新的行定义()
{Height=GridLength.Auto});
}
}
公共类HGrid:Grid
{
公共HGrid()
{
添加(新的ColumnDefinition()
{Width=GridLength.Auto});
添加(新的ColumnDefinition()
{Width=新的GridLength(1,GridUnitType.Star)});
添加(新的ColumnDefinition()
{Width=GridLength.Auto});
}
}
}
也可以用另一种方式将其嵌套:
<Page
x:Class="junk6.BlankPage3"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:junk6"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<Page.Resources>
<Style TargetType="Button">
<Setter Property="BorderBrush" Value="Black"/>
<Setter Property="BorderThickness" Value="2"/>
<Setter Property="Margin" Value="2"/>
</Style>
</Page.Resources>
<local:HGrid>
<local:VGrid Grid.Column="0">
<Button Grid.Row="0" Content="Button0"/>
<Button Grid.Row="1" Content="Button1"
VerticalAlignment="Stretch"/>
<Button Grid.Row="2" Content="Button2"/>
</local:VGrid>
<local:VGrid Grid.Column="1">
<Button Grid.Row="0" Content="Buttonc0"
HorizontalAlignment="Stretch" />
<Button Grid.Row="1" Content="Buttonc1"
HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>
<Button Grid.Row="2" Content="Buttonc2"
HorizontalAlignment="Stretch" />
</local:VGrid>
<local:VGrid Grid.Column="2">
<Button Grid.Row="0" Content="Button0"/>
<Button Grid.Row="1" Content="Button1"
VerticalAlignment="Stretch"/>
<Button Grid.Row="2" Content="Button2"/>
</local:VGrid>
</local:HGrid>
</Page>
Eureka
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
namespace GridNineExperiment
{
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 });
}
}
//================================================================
// NineGrid
//================================================================
public class NineGrid : VGrid
{
public HGrid inner0;
public HGrid inner1;
public HGrid inner2;
public NineGrid()
{
inner0 = new HGrid();
inner1 = new HGrid();
inner2 = new HGrid();
this.Children.Add(inner0);
this.Children.Add(inner1);
this.Children.Add(inner2);
Grid.SetRow(inner1, 0);
Grid.SetRow(inner1, 1);
Grid.SetRow(inner2, 2);
}
//===========================================================
// (0, 0)
//===========================================================
private FrameworkElement private_NG00 = null;
public FrameworkElement NG00
{
get { return private_NG00; }
set {
inner0.Children.Add(value);
Grid.SetColumn(value, 0);
private_NG00 = value;
}
}
//===========================================================
// (0, 1)
//===========================================================
private FrameworkElement private_NG01 = null;
public FrameworkElement NG01
{
get { return private_NG01; }
set
{
inner0.Children.Add(value);
Grid.SetColumn(value, 1);
private_NG01 = value;
}
}
//===========================================================
// (0, 2)
//===========================================================
private FrameworkElement private_NG02 = null;
public FrameworkElement NG02
{
get { return private_NG02; }
set
{
inner0.Children.Add(value);
Grid.SetColumn(value, 2);
private_NG02 = value;
}
}
//===========================================================
// (1, 0)
//===========================================================
private FrameworkElement private_NG10 = null;
public FrameworkElement NG10
{
get { return private_NG10; }
set
{
inner1.Children.Add(value);
Grid.SetColumn(value, 0);
private_NG10 = value;
}
}
//===========================================================
// (1, 1)
//===========================================================
private FrameworkElement private_NG11 = null;
public FrameworkElement NG11
{
get { return private_NG11; }
set
{
inner1.Children.Add(value);
Grid.SetColumn(value, 1);
private_NG11 = value;
}
}
//===========================================================
// (1, 2)
//===========================================================
private FrameworkElement private_NG12 = null;
public FrameworkElement NG12
{
get { return private_NG12; }
set
{
inner1.Children.Add(value);
Grid.SetColumn(value, 2);
private_NG12 = value;
}
}
//===========================================================
// (2, 0)
//===========================================================
private FrameworkElement private_NG20 = null;
public FrameworkElement NG20
{
get { return private_NG20; }
set
{
inner2.Children.Add(value);
Grid.SetColumn(value, 0);
private_NG20 = value;
}
}
//===========================================================
// (2, 1)
//===========================================================
private FrameworkElement private_NG21 = null;
public FrameworkElement NG21
{
get { return private_NG21; }
set
{
inner2.Children.Add(value);
Grid.SetColumn(value, 1);
private_NG21 = value;
}
}
//===========================================================
// (2, 2)
//===========================================================
private FrameworkElement private_NG22 = null;
public FrameworkElement NG22
{
get { return private_NG22; }
set
{
inner2.Children.Add(value);
Grid.SetColumn(value, 2);
private_NG22 = value;
}
}
} // Class
}
<Page
x:Class="GridNineExperiment.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:GridNineExperiment"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<Page.Resources>
<Style TargetType="Button">
<Setter Property="BorderBrush" Value="Black"/>
<Setter Property="BorderThickness" Value="2"/>
<Setter Property="Margin" Value="2"/>
</Style>
</Page.Resources>
<local:NineGrid>
<!-- ROW 0-->
<local:NineGrid.NG00>
<Button Content="Button0"/>
</local:NineGrid.NG00>
<local:NineGrid.NG01>
<Button Content="Button1" HorizontalAlignment="Stretch"/>
</local:NineGrid.NG01>
<local:NineGrid.NG02>
<Button Content="Button2"/>
</local:NineGrid.NG02>
<!-- ROW 1-->
<local:NineGrid.NG10>
<Button Content="Buttonc0" VerticalAlignment="Stretch"/>
</local:NineGrid.NG10>
<local:NineGrid.NG11>
<Button Content="Buttonc1" VerticalAlignment="Stretch" HorizontalAlignment="Stretch"/>
</local:NineGrid.NG11>
<local:NineGrid.NG12>
<Button Grid.Column="2" Content="Buttonc2" VerticalAlignment="Stretch"/>
</local:NineGrid.NG12>
<!-- ROW 2-->
<local:NineGrid.NG20>
<Button Content="Button0"/>
</local:NineGrid.NG20>
<local:NineGrid.NG21>
<Button Content="Button1" HorizontalAlignment="Stretch"/>
</local:NineGrid.NG21>
<local:NineGrid.NG22>
<Button Content="Button2"/>
</local:NineGrid.NG22>
</local:NineGrid>
</Page>
使用Windows.UI.Xaml;
使用Windows.UI.Xaml.Controls;
命名空间网格实验
{
公共类VGrid:Grid
{
公共VGrid()
{
添加(新的行定义()
{Height=GridLength.Auto});
添加(新的行定义()
{Height=新的GridLength(1,GridUnitType.Star)});
添加(新的行定义()
{Height=GridLength.Auto});
}
}
公共类HGrid:Grid
{
公共HGrid()
{
添加(新的ColumnDefinition()
{Width=GridLength.Auto});
添加(新的ColumnDefinition()
{Width=新的GridLength(1,GridUnitType.Star)});
添加(新的ColumnDefinition()
{Width=GridLength.Auto});
}
}
//================================================================
//尼尼格里德
//================================================================
公共类NineGrid:VGrid
{
公共HGrid-0;
公共卫生服务1;
公共卫生服务2;
公共NineGrid()
{
inner0=新HGrid();
inner1=新HGrid();
inner2=新HGrid();
this.Children.Add(inner0);
this.Children.Add(inner1);
this.Children.Add(inner2);
Grid.SetRow(inner1,0);
Grid.SetRow(inner1,1);
Grid.SetRow(inner2,2);
}
//===========================================================
// (0, 0)
//===========================================================
private FrameworkElement private_NG00=null;
公共框架元素NG00
{
获取{return private_NG00;}
设置{
inner0.Children.Add(value);
Grid.SetColumn(值为0);
private_NG00=价值;
}
}
//===========================================================
// (0, 1)
//===========================================================
private FrameworkElement private_NG01=null;
公共框架元素NG01
{
获取{return private_NG01;}
设置
{
inner0.Children.Add(value);
Grid.SetColumn(值1);
private_NG01=值;
}
}
//===========================================================
// (0, 2)
//===========================================================
private FrameworkElement private_NG02=null;
公共框架元素NG02
{
获取{return private_NG02;}
设置
{
inner0.Children.Add(value);
Grid.SetColumn(值2);
private_NG02=价值;
}
}
//===========================================================
// (1, 0)
//===========================================================
private FrameworkElement private_NG10=null;