首页 > 解决方案 > 如果将列宽设置为“2 *”以在 xaml WPF 中绑定?

问题描述

我在网格“MainGrid”的第三列中有 StackPanel。它的(第三列)宽度设置为“2*”。

我想使用边距隐藏 StackPanel,然后使用幻灯片动画来显示它。

所以我需要将StackPanel 的Margin设置为 Column[2] Width,但我怎样才能得到它?我正在尝试这个:

Margin="{Binding ElementName=MainGrid, Path=ColumnDefinitions[2].ActualWidth, Converter={StaticResource marginConverter}}

所以,我在代码隐藏中向转换器添加断点,它总是得到 0。

我尝试使用MainGrid .ActualWidth insted of Column[2] ActualWidth ,它首先发送到转换器,然后是实际宽度

标签: wpfxamlgridwpf-animationactualwidth

解决方案


不幸的是,ColumnDefinition.ActualWidth它不是依赖属性,这意味着它不会报告更新。一个快速的解决方案是编写一个继承自的新类,并在每次父级更新其布局时更改ColumnDefinition通知。而不是,在 xaml 中使用这个类。ActualWidthGridColumnDefinition

public class MyColumnDefinition : ColumnDefinition, INotifyPropertyChanged
{
    public MyColumnDefinition() : base() { }

    protected override void OnInitialized(EventArgs e)
    {
        base.OnInitialized(e);

        ((Grid)Parent).LayoutUpdated += MyColumnDefinition_LayoutUpdated;
    }

    private void MyColumnDefinition_LayoutUpdated(object sender, EventArgs e)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("ActualWidth"));
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

推荐阅读