wpf中的问题
从UIElement继承一个类,重写了OnRender public class MyRect : UIElement
{
public Brush backBrush = Brushes.LimeGreen;
public Brush foreBrush = Brushes.Blue; protected override void OnRender(DrawingContext drawingContext)
{
base.OnRender(drawingContext); Pen myPen = new Pen(foreBrush, 10);
Rect myRect = new Rect(0, 0, 500, 500);
drawingContext.DrawRectangle(backBrush, myPen, myRect); }
} ===========================
然后将此类实例化后添加到窗体中。没有问题,而且这次运行的颜色可以变化。
private void button9_Click(object sender, RoutedEventArgs e)
{
MyRect rect=new MyRect(); this.grid2.Children.Add(rect); rect.backBrush = Brushes.Red;
//这个没有问题,颜色正确的绘制出来了
} 在另外一个按钮事件中,就没法改变MyRect绘制的颜色了。
private void button10_Click(object sender, RoutedEventArgs e)
{
if (this.grid2.Children.Count != 0)
{
MyRect rect = this.grid2.Children[0] as MyRect; rect.backBrush = Brushes.Black; //rect.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
//rect.InvalidateVisual();
//无论如何都改变不了绘制的颜色,InvalidateVisual也不行 }
}
================================
以上就是问题,动态改变OnRender内容没有任何作用,或者是怎样手工触发OnRender(调用InvalidateVisual()没有任何作用)。
从UIElement继承一个类,重写了OnRender public class MyRect : UIElement
{
public Brush backBrush = Brushes.LimeGreen;
public Brush foreBrush = Brushes.Blue; protected override void OnRender(DrawingContext drawingContext)
{
base.OnRender(drawingContext); Pen myPen = new Pen(foreBrush, 10);
Rect myRect = new Rect(0, 0, 500, 500);
drawingContext.DrawRectangle(backBrush, myPen, myRect); }
} ===========================
然后将此类实例化后添加到窗体中。没有问题,而且这次运行的颜色可以变化。
private void button9_Click(object sender, RoutedEventArgs e)
{
MyRect rect=new MyRect(); this.grid2.Children.Add(rect); rect.backBrush = Brushes.Red;
//这个没有问题,颜色正确的绘制出来了
} 在另外一个按钮事件中,就没法改变MyRect绘制的颜色了。
private void button10_Click(object sender, RoutedEventArgs e)
{
if (this.grid2.Children.Count != 0)
{
MyRect rect = this.grid2.Children[0] as MyRect; rect.backBrush = Brushes.Black; //rect.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
//rect.InvalidateVisual();
//无论如何都改变不了绘制的颜色,InvalidateVisual也不行 }
}
================================
以上就是问题,动态改变OnRender内容没有任何作用,或者是怎样手工触发OnRender(调用InvalidateVisual()没有任何作用)。
MyRect rect = this.grid2.Children[0] as MyRect; 如果是这样获取rect以后使用rect.InvalidateVisual(); 无效果而如果把rect定义成窗体的一个成员变量,就没有问题了,使用rect.InvalidateVisual();
就有效果了。所以真是莫名其妙啊
{
/// <summary>
/// Window1.xaml 的交互逻辑
/// </summary>
public partial class Window1 : Window
{
//MyRext mr;
public Window1()
{
InitializeComponent();// 前面Xaml 中 一个Grid Name="ggg", 一个Button
MyRext mr = new MyRext();
ggg.Children.Add(mr); } private void Button_Click(object sender, RoutedEventArgs e)
{
MyRext mr = ggg.Children[1] as MyRext;//注意第几个孩子是 MyRext,要是错了就...哼哼!
if (mr == null) return;
mr.Fill = Brushes.Red;
mr.Rect = new Rect(0, 0, 10, 10);
mr.InvalidateVisual();
}
} public class MyRext : UIElement
{
Brush _Fill = Brushes.Green;
public Brush Fill
{
get { return _Fill; }
set
{
_Fill = value;
}
} Rect _Rect = new Rect(0, 0, 100, 100);
public Rect Rect
{
get { return _Rect; }
set
{
_Rect = value;
}
} protected override void OnRender(DrawingContext drawingContext)
{
drawingContext.DrawRectangle(_Fill, null, _Rect);
}
}
}