Wpf 如何使用x:static从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

我有一个静态只读变量,存储从运行时获取的文件路径。我想从这个静态只读变量加载spellcheck.customdictionaries uri,我该怎么做?我已经在xaml中指定了文件的完整路径:

<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)); } }