2

我正在尝试找到一种在 UIElement 上设置 Background 属性的通用方法。

我运气不太好...

到目前为止,这是我所拥有的(尝试使用反射来获取 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 或 Button 之类的东西。

对于 StackPanel 或 Button,“whatever”最终为 null。

我也觉得应该有一种简单的方法来通用地设置背景。我错过了明显的吗?

背景似乎仅在 System.Windows.Controls.Control 上可用,但我无法强制转换。

4

1 回答 1

5

您的反射调用实际上是错误的:您正在寻找Background PROPERTY,而不是BackgroundProperty DEPENDENCYPROPERTY

这应该是你的var whatever

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

这会很好用

旁注:

我强烈建议您摆脱无用的var并编写您正在等待的实际类型(在本例中为 a Brush),这将使您的代码更易于阅读

另外,为什么你不能只处理 aControl而不是 a UIElement?对我来说似乎很少见

干杯!

于 2013-04-25T21:32:05.500 回答