我可以设置依赖于其他属性的IntelliSense建议吗?

时间:2018-07-01 17:22:17

标签: c# wpf xaml 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接受枚举Styles中的值。
Control.Icon接受值Icons.[Regular, Solid, Brands]

Icon的IntelliSense建议取决于所选的Style。因此,如果Control.StyleStyles.Regular,则在Icons.Regular上仅显示关于Control.Icon的建议。

1 个答案:

答案 0 :(得分:0)

从理论上讲,可以添加一个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之类的工具动态生成代码。尝试手动维护大型列表时,引入错误非常容易。