首页 > 解决方案 > 我可以设置依赖于其他属性的 IntelliSense 建议吗?

问题描述

好的,这可能是一个幼稚的问题,但我想获得有关多个枚举属性的 IntelliSense 建议。出色地。有点。但让我解释一下。

我有几个像这样的枚举

public static class Icons 
{
    public enum Regular { /* ... */ }
    public enum Solid{ /* ... */ }
    public enum Brands { /* ... */ }
}

public enum Styles { /* ... */ }

现在我得到了一个带有两个 DependencyProperties 的 XAML 控件

public static readonly DependencyProperty MyStyleProperty = DependencyProperty.Register(nameof(MyStyle), typeof(Styles), typeof(Icon), new FrameworkPropertyMetadata(Styles.None, FrameworkPropertyMetadataOptions.AffectsRender, OnUpdateControl));

public static readonly DependencyProperty MyIconProperty = DependencyProperty.Register(nameof(MyIcon), typeof(object), typeof(Icon), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.AffectsRender, OnUpdateControl));

Control.Style接受来自 enum 的值Styles
Control.Icon接受值Icons.[Regular, Solid, Brands]

IntelliSense 建议Icon取决于所选的Style. 所以 if Control.Styleis Styles.Regularthen 只显示关于Icons.Regularon 的建议Control.Icon

标签: c#wpfxamlintellisense

解决方案


从理论上讲,添加一个CompletionProvider允许 Intellisense 处理您的单个类的方法是可能的,但对于这样一个常见问题来说,这将是多余的。相反,使用枚举类或使用类别类。

枚举类(不完全是,因为构造函数是公共的,但在这种情况下,将其打开似乎是合乎逻辑的):

public sealed class IconImage
{
    public Uri ImageUri { get; }
    public IconImage(Uri imageUri)
    {
        this.ImageUri = imageUri;
    }

    public static class ApplicationActions
    {
        public readonly IconImage Save = new IconImage(new Uri("foo"));
        public readonly IconImage Open = new IconImage(new Uri("foo"));
        public readonly IconImage Print = new IconImage(new Uri("foo"));
    }

    public static class Marks
    {
        public readonly IconImage Check = new IconImage(new Uri("foo"));
        public readonly IconImage Tickbox = new IconImage(new Uri("foo"));
        public readonly IconImage CheckedTickbox = new IconImage(new Uri("foo"));
    }

    // ...
}

// Usage: control.Icon = IconImage.Marks.TickBox;
// XAML (without TypeConverter): Icon="{x:Static local:IconImage.Marks.TickBox}"
// XAML (with TypeConverter): Icon="Marks.TickBox"

类别类:

public enum IconImage
{
    Save, Open, Print,
    Check, Tickbox, CheckedTickbox,
    // ...
}

public static class IconImages
{
    public static class Application
    {
        public static readonly IconImage
            Save = IconImage.Save,
            Open = IconImage.Open,
            Print = IconImage.Print;
    }

    public static class Marks
    {
        public static readonly IconImage
            Check = IconImage.Check,
            Tickbox = IconImage.Tickbox,
            CheckedTickbox = IconImage.CheckedTickbox;
    }

    // … other category classes …
}

// Usage: control.Icon = IconImage.Print  -- or --  control.Icon = IconImages.Application.Print
// XAML: Icon="Print" -- or -- Icon="{x:Static local:IconImages.Application.Print}"

无论哪种方式,我都建议使用 T4 或 XSLT 之类的工具来动态生成代码。尝试手动维护大型列表时很容易引入错误。


推荐阅读