绑定列定义宽度

本文关键字:定义 绑定 | 更新日期: 2023-09-27 18:21:14

我正在使用https://slideview.codeplex.com在Visual Studio 2015的帮助下,在Windows 10中。

我在设计中添加了一行两列的网格。在第一页中有大的图像,没有文本,在其他页面中有图标和文本。所以我把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"/>

最后在样式设置器中

<ColumnDefinition Width="{Binding library:SlideApplicationFrame.ContentFirstColumnWidth}"/>

整体风格设置如下

<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 WidthRowDefinition Height的值不是类型Double,而是类型GridLength

在那之后,我可以想到两种情况:

  1. 绑定到另一个元素的值

  2. 绑定到ViewModel的值或后面的代码

情况1:

如果您绑定到double的某个值,则还需要使用转换器将该值转换为GridLength

情况2:

如果绑定到代码中的某个内容,则可以创建类型为GridLength的属性并直接绑定,或者如果值为double,则可以像前面的用例一样再次使用Converter。

关于类型的一些参考

网格长度结构

GridUnitType枚举

  • 自动-大小由内容对象的大小属性决定
  • 像素-该值以像素表示
  • 星形-该值表示为可用空间的加权比例

编辑-只是一个简单的绑定示例

仍然没有找到时间重新创建您的确切情况,所以我只使用了GridView(因为它还有标题)-内容是紫色的,标题由两个网格列组成-绿色和红色,绿色绑定到主页中定义的依赖属性

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);
}