绑定列定义宽度

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

类型

之后我能想到的有两种情况:

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

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

案例一:

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

案例二:

如果您要绑定到代码中的某些内容,您可以创建 GridLength 类型的 属性 并直接绑定,或者如果值为 double 再次使用转换器,如以前的用例。

关于类型的一些参考

GridLength Structure

GridUnitType Enumeration

  • 自动 - 大小由内容的大小属性决定 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);
}