Question

I'm trying to find a generic way to set the Background property on a UIElement.

I'm not having much luck...

Here's what I have so far (trying to use reflection to get the 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);

The thing is...it works for something like a TextBlock, but does not work for something like a StackPanel or a Button.

"whatever" ends up being null for StackPanel or Button.

I also feel like there should be an easy way to generically set the Background. Am I missing obvious?

Background only appears to be available on System.Windows.Controls.Control but I can't cast to that.

Was it helpful?

Solution

Your reflection call is actually wrong: you are looking for the Background PROPERTY, not the BackgroundProperty DEPENDENCYPROPERTY

Here is what should be your var whatever :

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

And this will work fine

SIDE NOTES:

I strongly advice you to get rid of useless var and write the actual type you are waiting for (in this case, a Brush), that will make your code much easier to read

Also, why can't you just work on a Control and not an UIElement ? Seems pretty rare to me

Cheers!

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top