2012-03-09 109 views
1

這可能是一個愚蠢的問題,但如何設置一個usercontrol的顏色屬性?因爲在XAML的顏色只是一個文本字段我怎麼都值轉換,這樣我可以設置畫筆正確如何使用dependencyproperty設置顏色?

<MyUserControl LabelColour="#FF747474" /> <MyUserControl LabelColour="Red"/>

這是多遠我得了。該值以文本形式出現,但將其轉換爲畫筆的下一步是什麼?

private static DependencyProperty LabelColourProperty 
     = DependencyProperty.Register("LabelColour", typeof(object), typeof(MyUserControl), new PropertyMetadata(null)); 

    public object LabelColour 
    { 
     get { return GetValue(LabelColourProperty); } 
     set { SetValue(LabelColourProperty, value); LabelGrid.Background = (Brush)value; } 
    } 
+1

爲什麼你使用類型'對象',爲什麼不''刷'? – Zabavsky 2012-03-09 11:31:27

+0

沒有特別的理由,刷當然更好。但問題仍然是如何將值轉換爲畫筆。有沒有一種方法可以將文本值轉換爲有效的Color對象,然後我可以將它傳遞給「新的SolidColorBrush()」或類似的東西? – JohnCambell 2012-03-09 12:28:55

+0

玩過代碼之後,似乎必須讓它與XAML一起工作。 – JohnCambell 2012-03-09 16:41:45

回答

1
String xamlString = "<Canvas xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" Background=\"MistyRose\"/>"; 
Canvas c = (Canvas) System.Windows.Markup.XamlReader.Load(xamlString); 
SolidColorBrush mistyRoseBrush = (SolidColorBrush) c.Background; 
System.Windows.Media.Color mistyRose = mistyRoseBrush.Color; 

,我認爲這可以幫助你。

+0

謝謝,這個作品非常漂亮。 – JohnCambell 2012-03-09 15:56:24

1

Silverlight沒有公開將字符串轉換爲Color的直接方法。您將得到最接近的方法是Color.FromArgb方法。請參閱Color,其中包含最接近實現所需內容的簡單代碼(如Vinicius直接引用的內容)。

就我個人而言,我只是不會使用object作爲屬性類型,並讓XamlParser負責它(無論如何你都是人爲的)。

這是它應該如何看:

private static DependencyProperty LabelColourProperty 
     = DependencyProperty.Register("LabelColour", typeof(Brush), typeof(MyUserControl), new PropertyMetadata(null, OnLabelColourChanged)); 

private static void OnLabelColourChanged(DependencyObject source, 
          DependencyPropertyChangedEventArgs e) 
{ 
    MyUserControl ctl = source as MyUserControl; 
    if (ctl != null) 
    { 
     ctl.LabelGrid.Background = (Brush)e.NewValue; 
    } 
} 

public Brush LabelColour 
{ 
    get { return GetValue(LabelColourProperty) as Brush; } 
    set { SetValue(LabelColourProperty, value); } 
} 

注意切勿將其他代碼在作爲依賴屬性實施的setter方法。當通過綁定來設置該值(這是首先將其作爲依賴項屬性來實現的完整點),則直接使用SetValue方法繞過普通屬性設置器。因此,當需要在on屬性中完成值更改時,需要發生的任何事情都會改變屬性元數據可以提供的回調。

+0

我只是試過這個,但我不確定在XAML中設置LabelColour時如何工作。現在將任何值放入LabelColour都會使應用程序崩潰。有什麼我失蹤? – JohnCambell 2012-03-09 15:40:58

+0

當我將「typeof(Brush)」改爲「typeof(object)」後,我得到了它的工作。在我看來,它必須是反對的。因此,我也將此標記爲答案。 – JohnCambell 2012-03-09 16:10:13

+0

註冊調用中的'typeof(Brush)'是正確的,但Getter需要一些小改動。 – AnthonyWJones 2012-03-09 16:58:02