Wpf 如何使用x:static从xaml指定构造函数参数
我有一个静态只读变量,存储从运行时获取的文件路径。我想从这个静态只读变量加载spellcheck.customdictionaries uri,我该怎么做?我已经在xaml中指定了文件的完整路径:Wpf 如何使用x:static从xaml指定构造函数参数,wpf,xaml,silverlight,Wpf,Xaml,Silverlight,我有一个静态只读变量,存储从运行时获取的文件路径。我想从这个静态只读变量加载spellcheck.customdictionaries uri,我该怎么做?我已经在xaml中指定了文件的完整路径: <TextBox Name="txtNote" Grid.Column="0" AcceptsReturn="True" MaxLines="2" VerticalScrollBarVisib
<TextBox Name="txtNote"
Grid.Column="0"
AcceptsReturn="True"
MaxLines="2"
VerticalScrollBarVisibility="Auto"
Text="{Binding Path=Note,
ElementName=ucNoteEditor}"
TextWrapping="WrapWithOverflow" SpellCheck.IsEnabled="True" >
<SpellCheck.CustomDictionaries>
<sys:Uri>m:\test.lex</sys:Uri>
</SpellCheck.CustomDictionaries>
</TextBox>
m:\test.lex
我想让Uri在运行时从静态变量获取它的值。我想在xaml上做这件事,而不是从代码隐藏开始。需要指定构造函数参数,但我认为这不适用(per)
从XAML实现这一点最简单的方法可能是编写行为
。它可以提供一个“Url”参数,以便您可以像这样使用它:
<TextBox ...>
<i:Interaction.Behaviors>
<local:CustomDictionaryBehavior Url="{StaticResource SomeKey}" />
</i:Interaction.Behaviors>
</TextBox>
public class CustomDictionaryBehavior : Behavior<TextBox>
{
public static string GetUrl(DependencyObject obj)
{
return (string)obj.GetValue(UrlProperty);
}
public static void SetUrl(DependencyObject obj, string value)
{
obj.SetValue(UrlProperty, value);
}
public static readonly DependencyProperty UrlProperty =
DependencyProperty.RegisterAttached("Url", typeof(string), typeof(CustomDictionaryBehavior), new PropertyMetadata((sender, args) => {
Interaction.GetBehaviors(sender).Add(new CustomDictionaryBehavior());
}));
protected override void OnAttached()
{
string url = GetUrl(AssociatedObject);
AssociatedObject.CustomDictionaries.Add(new Uri(url));
}
}
当然,您可以通过将“Url”作为附加属性来附加/分离行为,从而进一步简化,这将允许您简单地编写:
<TextBox ... local:CustomDictionaryBehavior.Url="{StaticResource SomeKey}" />
行为代码应该如下所示:
<TextBox ...>
<i:Interaction.Behaviors>
<local:CustomDictionaryBehavior Url="{StaticResource SomeKey}" />
</i:Interaction.Behaviors>
</TextBox>
public class CustomDictionaryBehavior : Behavior<TextBox>
{
public static string GetUrl(DependencyObject obj)
{
return (string)obj.GetValue(UrlProperty);
}
public static void SetUrl(DependencyObject obj, string value)
{
obj.SetValue(UrlProperty, value);
}
public static readonly DependencyProperty UrlProperty =
DependencyProperty.RegisterAttached("Url", typeof(string), typeof(CustomDictionaryBehavior), new PropertyMetadata((sender, args) => {
Interaction.GetBehaviors(sender).Add(new CustomDictionaryBehavior());
}));
protected override void OnAttached()
{
string url = GetUrl(AssociatedObject);
AssociatedObject.CustomDictionaries.Add(new Uri(url));
}
}
公共类CustomDictionaryBehavior:行为
{
公共静态字符串GetUrl(DependencyObject obj)
{
返回(字符串)obj.GetValue(UrlProperty);
}
公共静态void SetUrl(DependencyObject对象,字符串值)
{
obj.SetValue(UrlProperty,value);
}
公共静态只读DependencyProperty UrlProperty=
DependencyProperty.RegisterAttached(“Url”、typeof(字符串)、typeof(CustomDictionaryBehavior)、new PropertyMetadata((发送方,参数)=>{
Interaction.GetBehaviors(sender.Add)(新建CustomDictionaryBehavior());
}));
受保护的覆盖无效附加()
{
字符串url=GetUrl(关联对象);
添加(新的Uri(url));
}
}