2010-02-01 65 views
1

是否可以在XAML的不同UI元素中引入'自定義'屬性?也可以稍後閱讀它們,就像我們在ASP.NET中添加服務器控件的屬性一樣?如何添加自定義Silverlight XAML屬性?

我打算讀取特定的屬性並一起對它們進行操作。

回答

3

這聽起來像你想找到Attached Properties

附加屬性允許您添加屬性,可以在Xaml中定義,可以「附加」到任何UIelement。然後像其他任何依賴屬性一樣retrieve them in code

+0

裏德,謝謝你的回答。很高興知道它在框架內。標記爲'正確' – kanchirk 2010-02-03 14:45:26

2

我已經完成的方式是通過創建一個繼承基本控件的新類。

例如,我有一個名爲WebTextBox的類繼承了TextBox。並且在WebTextBox裏面有一些自定義屬性和事件。通過這樣做,您將繼承TextBox控件的所有行爲。但是如果您選擇,您可以在這裏獲得創意,甚至通過覆蓋事件等來修改行爲。

無論如何,在創建類之後,您必須將項目的名稱空間添加到XAML中。事情是這樣的:

xmlns:me="clr-namespace:YourNamespace;assembly=YourAssembly" 

然後你就可以添加一個WebTextBox(或者無論你怎麼稱呼它)是這樣的:

<me:WebTextBox CustomAttribute="cool stuff" /> 
+0

Steve,的確是個好主意。如果不是用於附加屬性,將會使用它。謝謝回答。 – kanchirk 2010-02-03 14:46:05

3

以下是我傾向於採取的方法。

創建一個名爲元一個新的類文件: -

namespace SilverlightApplication1 
{ 
    public static class Meta 
    { 
    #region SomeValue 
    public static string GetSomeValue(DependencyObject obj) 
    { 
     return (string)obj.GetValue(SomeValueProperty); 
    } 
    public static void SetSomeValue(DependencyObject obj, string value) 
    { 
     obj.SetValue(SomeValueProperty, value); 
    } 

    public static readonly DependencyProperty SomeValueProperty = 
     DependencyProperty.RegisterAttached("SomeValue", typeof(string), typeof(Meta), 
     new PropertyMetadata(null)); 
    #end region 

    #region SomeOtherValue 
    // Boilerplate code from above. 
    #end region 
    } 
} 

值現在可以在XAML附加這樣的: -

<TextBox x:Name="txt" local:Meta.SomeValue="Hello, World!" /> 

在代碼中的一些點這個值可以被檢索: -

string value = Meta.GetSomeValue(txt); 

請注意,您不必堅持使用String作爲屬性y的類型你幾乎可以使用任何你喜歡的類型,並且限制如果你可以將它附加到XAML中,類型必須與XAML構造對象的方式(例如需要默認構造函數)兼容。

+0

安東尼,謝謝你的回答。我對「自定義」附加屬性有了一些新的見解。 – kanchirk 2010-02-03 14:47:02