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()没有任何作用)。

解决方案 »

  1.   

    为了别人以后还会出现这个问题,我多说两句,其实原因还是没有弄清楚,但是
    MyRect rect = this.grid2.Children[0] as MyRect; 如果是这样获取rect以后使用rect.InvalidateVisual(); 无效果而如果把rect定义成窗体的一个成员变量,就没有问题了,使用rect.InvalidateVisual();     
    就有效果了。所以真是莫名其妙啊
      

  2.   

    代码如下:===========优雅的分割线====================namespace WpfApplication2
    {
        /// <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);
            }
        }
    }