我创建了一个自定义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
中列出的所有属性,没有任何明显的信息突然出现在我身上。
答案 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;
}
}