首页 > 解决方案 > 在 UserControl 中注册附加属性

问题描述

我正在尝试创建一个 UserControl 来公开其他 2 个控件 UI 和 Host,以便我可以使用 MediaPlayerWpf 并在设计器中设置属性,例如 UI.AllowPause 和 Host.Volume

我了解附加属性是我需要的。此外,我需要允许设置主机,而 UI 仅公开其属性但不能更改。

我无法在设计器中显示属性 UI 和主机。我究竟做错了什么?

public partial class MediaPlayerWpf {
    public MediaPlayerWpf() {
        InitializeComponent();
        SetUI(this, MediaUI);
    }

    public static DependencyPropertyKey UIPropertyKey = DependencyProperty.RegisterAttachedReadOnly("UI", typeof(PlayerControls), typeof(MediaPlayerWpf), new PropertyMetadata(null));
    public static DependencyProperty UIProperty = UIPropertyKey.DependencyProperty;
    public PlayerControls UI { get => (PlayerControls)base.GetValue(UIProperty); private set => base.SetValue(UIPropertyKey, value); }
    [AttachedPropertyBrowsableForType(typeof(MediaPlayerWpf))]
    public static PlayerControls GetUI(UIElement element) {
        return (PlayerControls)element.GetValue(UIProperty);
    }
    public static void SetUI(UIElement element, PlayerControls value) {
        element.SetValue(UIPropertyKey, value);
    }

    public static DependencyProperty HostProperty = DependencyProperty.RegisterAttached("Host", typeof(PlayerBase), typeof(MediaPlayerWpf), new PropertyMetadata(null, OnHostChanged));
    public PlayerBase Host { get => (PlayerBase)base.GetValue(HostProperty); set => base.SetValue(HostProperty, value); }
    private static void OnHostChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) {
        MediaPlayerWpf P = d as MediaPlayerWpf;
        if (e.OldValue != null)
            P.HostGrid.Children.Remove(e.OldValue as PlayerBase);
        if (e.NewValue != null) {
            P.HostGrid.Children.Add(e.NewValue as PlayerBase);
            GetUI(P).PlayerHost = e.NewValue as PlayerBase;
        }
    }
    [AttachedPropertyBrowsableForType(typeof(MediaPlayerWpf))]
    public static PlayerBase GetHost(UIElement element) {
        return (PlayerBase)element.GetValue(HostProperty);
    }
    public static void SetHost(UIElement element, PlayerBase value) {
        element.SetValue(HostProperty, value);
    }
}

标签: c#wpfdependency-properties

解决方案


推荐阅读