在XAML中为自定义MarkupExtension提供Intellisense

时间:2017-10-18 18:48:53

标签: c# wpf xaml intellisense markup-extensions

我创建了一个自定义private void btn1_Click(object sender, RoutedEventArgs e) { OpenFileDialog ofd = new OpenFileDialog() { Filter = "Text Documents |*.cs;*.txt", ValidateNames = true, Multiselect = false }; if (ofd.ShowDialog() == true) rtb.Text = File.ReadAllText(ofd.FileName); string[] userText = rtb.Text.ToLower().Split(new char[] { ' ', ',', '=', '+', '}', '{', '\r', '\n', '(', ')', ';' }, StringSplitOptions.RemoveEmptyEntries); var frequencies = new Dictionary<string, int>(); foreach (string word in userText) //search words in our array userText that we declared at the beginning. { // Sample here if (frequencies.Contains(word)) { frequencies[word]++; } else { frequencies.Add(word,1); } } foreach (var kvp in frequencies) Console.WriteLine("Word: {0} \t Frequency: {1}",kvp.Key, kvp.Value); } ,可以轻松地将事件从MarkupExtension转发到视图模型上的方法。一切都很完美,除了Visual Studio在填写XAML时不提供任何Intellisense。有什么方法可以为Visual Studio提供提供Intellisense所需的信息吗?

FrameworkElements

MarkupExtension

视图模型:

public class VmCall : MarkupExtension
{
    public string ActionName { get; }

    public VmCall(string actionName)
    {
        ActionName = actionName;
    }
    //.....
}

在XAML中使用class TestWindowVm : ViewModel { public void Click() { MessageBox.Show("Click!"); } }

MarkupExtension

理想情况下,当用户在“VmCall”之后按空格键时,Intellisense应该向他们显示当前元素<Window x:Class="WpfLib.Tests.VmCallMarkupExtension.TestWindow" xmlns:wpfLib="clr-namespace:AgentOctal.WpfLib;assembly=WpfLib" //Many xmlns and attributes left out of example for brevity. d:DataContext="{d:DesignInstance TestWindowVm}" mc:Ignorable="d"> <Button Click="{wpfLib:VmCall Click}"/> </Window> 上的所有方法的列表(DataContext上的Click在这个具体的例子中)。

如果 以某种方式使这项工作,基于以前的WinForms经验,我希望我可以在TestWindowVm的构造函数的参数上放置某种Attribute 1}}通知Visual Studio如何为该参数生成intellisense。到目前为止,我还没有找到类似的东西。我不确定我是否真的在寻找错误的东西,或者这根本不可能做到。如果重要,我主要对Visual Studio 2017感兴趣。

我查看了System.Windows.Markup中列出的所有属性,没有任何明显的信息突然出现在我身上。

1 个答案:

答案 0 :(得分:0)

您已经使用字符串输入创建了MarkupExtension。 Intellisense如何知道您想要哪个字符串?但是例如,如果您使用枚举,则Intellisense会为您提供很多建议。

public enum MyEnum
    {
        first , second 
    }

public class VmCall : MarkupExtension
{
    public MyEnum ActionName { get; }

    public VmCall(MyEnum actionName)
    {
        ActionName = actionName;
    }
    //.....
    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        return this;
    }
}