如何使用x:static从xaml指定构造函数参数

时间:2014-09-04 20:58:13

标签: wpf xaml silverlight

我有一个静态只读变量,用于存储从运行时获取的文件路径。我想从这个静态只读变量加载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>

我想这样做,以便Uri在运行时从静态变量中获取它的值。我想在xaml上做,而不是从后面的代码。

1 个答案:

答案 0 :(得分:0)

x:Arguments来指定构造函数参数,但我认为不适用(每this answer)。

从XAML执行此操作的最简单方法可能是编写Behavior<TextBox>。这可以提供“Url”参数,以便您可以像这样使用它:

<TextBox ...>
    <i:Interaction.Behaviors>
        <local:CustomDictionaryBehavior Url="{StaticResource SomeKey}" />
    </i:Interaction.Behaviors>
</TextBox>

当然,您可以通过使“Url”成为附加属性来进一步简化,该属性可以附加/分离行为,这样您就可以简单地编写:

<TextBox ... local:CustomDictionaryBehavior.Url="{StaticResource SomeKey}" />

行为代码应如下所示:

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