首页 > 解决方案 > Avalonia UI 中的 FrameworkPropertyMetadataOptions.AffectsParentArrange?

问题描述

在 WPF 中声明属性时,可以像这样设置元数据

public static readonly DependencyProperty IsStopVisibleProperty = 
    DependencyProperty.Register("IsStopVisible", typeof(bool), typeof(MediaPlayer),
    new FrameworkPropertyMetadata(true, FrameworkPropertyMetadataOptions.AffectsParentArrange));

在 Avalon UI 中,没有设置元数据的参数

public static readonly StyledProperty<bool> IsStopVisibleProperty = 
    AvaloniaProperty.Register<MediaPlayer, bool>(nameof(IsStopVisible), true);

FrameworkPropertyMetadataOptions.AffectsParentArrange 的等价物是什么?

标签: c#.netavaloniaui

解决方案


使属性影响控件本身排列的最简单方法是AffectsArrange在控件的静态构造函数中添加调用:

static MediaPlayer()
{
    AffectsArrange(IsStopVisibleProperty);
}

但是,这相当于 WPF 的FrameworkPropertyMetadataOptions.AffectsArrange标志,而不是AffectsParentArrange. 控件的属性直接影响父控件的排列是很不寻常的——这种情况AffectsParentArrange通常仅限于Panel控件上的附加属性。因此,AvaloniaAffectsParentArrange是一种受保护的方法,Panel因此您可能无法控制。

但是,如果您确定需要在属性更改时使父安排无效,那么最好的方法可能是简单地使父安排无效OnPropertyChanged

        protected override void OnPropertyChanged<T>(AvaloniaPropertyChangedEventArgs<T> change)
        {
            if (change.Property == IsStopVisibleProperty)
            {
                ((Control)Parent)?.InvalidateArrange();
            }

            base.OnPropertyChanged(change);
        }

推荐阅读