绑定列定义宽度
Binding ColumDefinition Width
我在 Visual Studio 2015 的帮助下,在 Windows 10 中使用 https://slideview.codeplex.com 创建了一个 Windows 8.1 应用程序。
我在 1 行 2 列的设计中添加了网格。在第一页中有大图像,没有文字,在其他页面中有图标和文字。所以我将 if 4* 放在第一页的第一列中,将 2* 放在第二页的第一列中,一切正常,但我想在 ContentPresenter 中使其动态化,然后我可以从 C# 分配它。
请有人帮助我。
我尝试了不同的方式,就像我在 SlideApplicationFrame.cs
中放入下面的代码一样
#region FirstColumnWidth (DependencyProperty)
/// <summary>
/// header Image First Column Width
/// </summary>
public GridLength FirstColumnWidth
{
get { return (GridLength)GetValue(FirstColumnWidthProperty); }
set { SetValue(FirstColumnWidthProperty, value); }
}
public static readonly DependencyProperty FirstColumnWidthProperty =
DependencyProperty.Register("FirstColumnWidth", typeof(GridLength), typeof(SlideApplicationFrame),
new PropertyMetadata(new GridLength(4, GridUnitType.Star)));
#endregion
#region ContentFirstColumnWidth (Attached DependencyProperty)
public static readonly DependencyProperty ContentFirstColumnWidth =
DependencyProperty.RegisterAttached("ContentFirstColumnWidth", typeof(GridLength), typeof(SlideApplicationFrame), new PropertyMetadata(new GridLength(4, GridUnitType.Star)));
public static void SetContentFirstColumnWidth(DependencyObject o, GridLength value)
{
o.SetValue(ContentFirstColumnWidth, value);
}
public static GridLength GetContentFirstColumnWidth(DependencyObject o)
{
return (GridLength)o.GetValue(ContentFirstColumnWidth);
}
#endregion
然后我像这样在我的 ContentPresenter 中使用它
<ContentPresenter library:SlideApplicationFrame.ContentFirstColumnWidth="{TemplateBinding FirstColumnWidth}" Grid.Column="1"/>
最后的风格是 setter
<ColumnDefinition Width="{Binding library:SlideApplicationFrame.ContentFirstColumnWidth}"/>
整体风格Setter如下
<Setter Property="HeaderTemplate">
<Setter.Value>
<DataTemplate>
<Grid x:Name="GridHeader">
<Grid.RowDefinitions>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="{Binding library:SlideApplicationFrame.ContentFirstColumnWidth}"/>
<ColumnDefinition Width="5*"/>
</Grid.ColumnDefinitions>
</Grid>
</DataTemplate>
</Setter.Value>
</Setter>
和 MainPage.xaml.cs
的设置
SlideApplicationFrame RootFrame = Window.Current.Content as SlideApplicationFrame;
RootFrame.FirstColumnWidth = new GridLength(4, GridUnitType.Star);
请帮助我,我将不胜感激
首先你要记住 ColumnDefinition Width
和 RowDefinition Height
的值不是 Double
类型而是 GridLength
类型
之后我能想到的有两种情况:
绑定到另一个元素的值
从 ViewModel 或后面的代码绑定到值
案例一:
如果您要绑定到 double
的某个值,您还需要使用转换器将此值转换为 GridLength
案例二:
如果您要绑定到代码中的某些内容,您可以创建 GridLength
类型的 属性 并直接绑定,或者如果值为 double
再次使用转换器,如以前的用例。
关于类型的一些参考
- 自动 - 大小由内容的大小属性决定 object。
- 像素 - 该值以像素表示。
- 星级 - 该值表示为可用的加权比例 space。
编辑 - 只是一个有效绑定的简单示例
仍然没时间重现您的确切情况,所以我只使用了 GridView
(因为它也有 header)- 内容是紫色的,header 包括两个网格列 - 绿色和红色,绿色绑定到主页
中定义的依赖项属性
XAML
<Page
...
x:Name="root">
<Page.Resources>
<Style TargetType="GridView" >
<Setter Property="HeaderTemplate">
<Setter.Value>
<DataTemplate>
<Grid x:Name="GridHeader" Height="200">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="5*"/>
<ColumnDefinition Width="{Binding ElementName=root, Path=TestGridLength}"/>
</Grid.ColumnDefinitions>
<Grid Background="Red" Grid.Column="0"></Grid>
<Grid Background="Green" Grid.Column="1"></Grid>
</Grid>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
</Page.Resources>
<GridView Background="Purple">
</GridView>
</Page>
代码隐藏
public GridLength TestGridLength
{
get { return (GridLength)GetValue(TestGridLengthProperty); }
set { SetValue(TestGridLengthProperty, value); }
}
public static readonly DependencyProperty TestGridLengthProperty =
DependencyProperty.Register(
"TestGridLength",
typeof(GridLength),
typeof(MainPage),
new PropertyMetadata(null));
public MainPage()
{
this.InitializeComponent();
this.TestGridLength = new GridLength(10, GridUnitType.Star);
}
我在 Visual Studio 2015 的帮助下,在 Windows 10 中使用 https://slideview.codeplex.com 创建了一个 Windows 8.1 应用程序。
我在 1 行 2 列的设计中添加了网格。在第一页中有大图像,没有文字,在其他页面中有图标和文字。所以我将 if 4* 放在第一页的第一列中,将 2* 放在第二页的第一列中,一切正常,但我想在 ContentPresenter 中使其动态化,然后我可以从 C# 分配它。
请有人帮助我。
我尝试了不同的方式,就像我在 SlideApplicationFrame.cs
中放入下面的代码一样#region FirstColumnWidth (DependencyProperty)
/// <summary>
/// header Image First Column Width
/// </summary>
public GridLength FirstColumnWidth
{
get { return (GridLength)GetValue(FirstColumnWidthProperty); }
set { SetValue(FirstColumnWidthProperty, value); }
}
public static readonly DependencyProperty FirstColumnWidthProperty =
DependencyProperty.Register("FirstColumnWidth", typeof(GridLength), typeof(SlideApplicationFrame),
new PropertyMetadata(new GridLength(4, GridUnitType.Star)));
#endregion
#region ContentFirstColumnWidth (Attached DependencyProperty)
public static readonly DependencyProperty ContentFirstColumnWidth =
DependencyProperty.RegisterAttached("ContentFirstColumnWidth", typeof(GridLength), typeof(SlideApplicationFrame), new PropertyMetadata(new GridLength(4, GridUnitType.Star)));
public static void SetContentFirstColumnWidth(DependencyObject o, GridLength value)
{
o.SetValue(ContentFirstColumnWidth, value);
}
public static GridLength GetContentFirstColumnWidth(DependencyObject o)
{
return (GridLength)o.GetValue(ContentFirstColumnWidth);
}
#endregion
然后我像这样在我的 ContentPresenter 中使用它
<ContentPresenter library:SlideApplicationFrame.ContentFirstColumnWidth="{TemplateBinding FirstColumnWidth}" Grid.Column="1"/>
最后的风格是 setter
<ColumnDefinition Width="{Binding library:SlideApplicationFrame.ContentFirstColumnWidth}"/>
整体风格Setter如下
<Setter Property="HeaderTemplate">
<Setter.Value>
<DataTemplate>
<Grid x:Name="GridHeader">
<Grid.RowDefinitions>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="{Binding library:SlideApplicationFrame.ContentFirstColumnWidth}"/>
<ColumnDefinition Width="5*"/>
</Grid.ColumnDefinitions>
</Grid>
</DataTemplate>
</Setter.Value>
</Setter>
和 MainPage.xaml.cs
的设置SlideApplicationFrame RootFrame = Window.Current.Content as SlideApplicationFrame;
RootFrame.FirstColumnWidth = new GridLength(4, GridUnitType.Star);
请帮助我,我将不胜感激
首先你要记住 ColumnDefinition Width
和 RowDefinition Height
的值不是 Double
类型而是 GridLength
之后我能想到的有两种情况:
绑定到另一个元素的值
从 ViewModel 或后面的代码绑定到值
案例一:
如果您要绑定到 double
的某个值,您还需要使用转换器将此值转换为 GridLength
案例二:
如果您要绑定到代码中的某些内容,您可以创建 GridLength
类型的 属性 并直接绑定,或者如果值为 double
再次使用转换器,如以前的用例。
关于类型的一些参考
- 自动 - 大小由内容的大小属性决定 object。
- 像素 - 该值以像素表示。
- 星级 - 该值表示为可用的加权比例 space。
编辑 - 只是一个有效绑定的简单示例
仍然没时间重现您的确切情况,所以我只使用了 GridView
(因为它也有 header)- 内容是紫色的,header 包括两个网格列 - 绿色和红色,绿色绑定到主页
XAML
<Page
...
x:Name="root">
<Page.Resources>
<Style TargetType="GridView" >
<Setter Property="HeaderTemplate">
<Setter.Value>
<DataTemplate>
<Grid x:Name="GridHeader" Height="200">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="5*"/>
<ColumnDefinition Width="{Binding ElementName=root, Path=TestGridLength}"/>
</Grid.ColumnDefinitions>
<Grid Background="Red" Grid.Column="0"></Grid>
<Grid Background="Green" Grid.Column="1"></Grid>
</Grid>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
</Page.Resources>
<GridView Background="Purple">
</GridView>
</Page>
代码隐藏
public GridLength TestGridLength
{
get { return (GridLength)GetValue(TestGridLengthProperty); }
set { SetValue(TestGridLengthProperty, value); }
}
public static readonly DependencyProperty TestGridLengthProperty =
DependencyProperty.Register(
"TestGridLength",
typeof(GridLength),
typeof(MainPage),
new PropertyMetadata(null));
public MainPage()
{
this.InitializeComponent();
this.TestGridLength = new GridLength(10, GridUnitType.Star);
}