2013-04-25 52 views
2

我正試圖找到一種通用的方法來設置UIElement上的背景屬性。獲取UIElement或發件人的背景

我沒有多少運氣...

這裏是我迄今(嘗試使用反射來獲取BackgroundProperty)。

Action<UIElement> setTheBrushMethod = (UIElement x) => 
    { 
    var brush = new SolidColorBrush(Colors.Yellow); 
    var whatever = x.GetType().GetField("BackgroundProperty"); 
    var val = whatever.GetValue(null); 
    ((UIElement)x).SetValue(val as DependencyProperty, brush); 
    brush.BeginAnimation(SolidColorBrush.ColorProperty, new ColorAnimation(Colors.White, TimeSpan.FromSeconds(3))); 
    }; 
    setTheBrushMethod(sender as UIElement); 

的事情是......它適用於像TextBlock的,但對於像一個StackPanel或按鈕不起作用。

「無論」結束爲StackPanel或Button爲空。

我也覺得應該有一個簡單的方法來一般地設置背景。我錯過了明顯嗎?

背景似乎只能在System.Windows.Controls.Control上使用,但我無法轉換爲此。

+0

嗯....你有沒有考慮使用樣式? – failedprogramming 2013-04-26 00:36:31

回答

4

你的反射調用其實是錯誤的:你正在尋找的BackgroundPROPERTY,而不是BackgroundProperty的DependencyProperty

這裏是應該是你的var whatever

var whatever = x.GetType().GetProperty("Background").GetValue(x); 
x.GetType().GetProperty("Background").SetValue(x, brush); 

而這將工作細

邊注意事項:

我強烈建議你擺脫無用var,寫你在等待的實際類型(在這種情況下,Brush),這將使你的代碼更易於閱讀

另外,爲什麼能你不是在Control上工作,而是在UIElement上工作?似乎對我來說很難得

乾杯!

+0

乾杯!這工作。 回覆備註: 1. var是我從ReSharper領取的壞習慣。同意。 2.我需要UIElement,因爲這實際上是attachedProperty中元數據更改事件的一部分。我有一個RoutedEvent attachedProperty,它會觸發給定UIElement的脈衝。 難以解釋通過互聯網。 您的幫助非常感謝。 – tronious 2013-04-26 04:25:36