Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF绘图上下文_C#_Wpf_Drawing_Brush_Pen - Fatal编程技术网

C# WPF绘图上下文

C# WPF绘图上下文,c#,wpf,drawing,brush,pen,C#,Wpf,Drawing,Brush,Pen,在我的wpf应用程序中,我绘制了许多几何图形,如下所示。我的要求是改变drawingvisual的颜色而不重新绘制?wpf有什么可能性吗 using (DrawingContext vDrawingContext = vDrawingVisual.RenderOpen()) { StreamGeometry vGeom = GetCutGeometry(mLength, mWidth); vDrawingContext.DrawGeom

在我的wpf应用程序中,我绘制了许多几何图形,如下所示。我的要求是改变drawingvisual的颜色而不重新绘制?wpf有什么可能性吗

  using (DrawingContext vDrawingContext = vDrawingVisual.RenderOpen())
        {
          StreamGeometry vGeom = GetCutGeometry(mLength, mWidth);
          vDrawingContext.DrawGeometry(mBackGroundBrush, ForeGroundPen, vGeom);
          vDrawingContext.Close();
          VisualChildren.Add(vDrawingVisual);    

        }

mBackGroundBrush动态颜色怎么可能?

如果
mBackGroundBrush
是一个可修改的
SolidColorBrush
(即它是在应用程序中创建的,没有预定义的笔刷),您只需更改其
颜色属性即可。这将通过重绘更改每个绘制几何图形的填充颜色

private SolidColorBrush mBackGroundBrush = new SolidColorBrush(Colors.Black);

...

mBackGroundBrush.Color = Colors.Red;


如果
mBackGroundBrush
是可修改的
SolidColorBrush
(即,它是在应用程序中创建的,并且没有预定义的笔刷),则可以简单地更改其
颜色属性。这将通过重绘更改每个绘制几何图形的填充颜色

private SolidColorBrush mBackGroundBrush = new SolidColorBrush(Colors.Black);

...

mBackGroundBrush.Color = Colors.Red;


我已经做了如下一项工作。看起来很有效

///Kept as arefrence while initial drawing phase.
private DrawingVisual mDrawingVisual = null;

 if (null != mDrawingVisual)
      {
        using (DrawingContext vDrawingContext = mDrawingVisual.RenderOpen())
        {
          DrawingGroup vDrawingGroup = VisualTreeHelper.GetDrawing(mDrawingVisual);
          if (null != vDrawingGroup)
          {
            foreach (Drawing vDrawing in vDrawingGroup.Children)
            {
              GeometryDrawing vGeometryDrawing = vDrawing as GeometryDrawing;
              if (null != vGeometryDrawing)
              {
                vGeometryDrawing.Brush = mBackGroundBrush;
              }
            }
          }

          vDrawingContext.DrawDrawing(vDrawingGroup);
          vDrawingContext.Close();
        }
      }

我已经做了如下一项工作。看起来很有效

///Kept as arefrence while initial drawing phase.
private DrawingVisual mDrawingVisual = null;

 if (null != mDrawingVisual)
      {
        using (DrawingContext vDrawingContext = mDrawingVisual.RenderOpen())
        {
          DrawingGroup vDrawingGroup = VisualTreeHelper.GetDrawing(mDrawingVisual);
          if (null != vDrawingGroup)
          {
            foreach (Drawing vDrawing in vDrawingGroup.Children)
            {
              GeometryDrawing vGeometryDrawing = vDrawing as GeometryDrawing;
              if (null != vGeometryDrawing)
              {
                vGeometryDrawing.Brush = mBackGroundBrush;
              }
            }
          }

          vDrawingContext.DrawDrawing(vDrawingGroup);
          vDrawingContext.Close();
        }
      }


mBackGroundBrush会在我需要更改颜色时更新,并调用上面的颜色更改代码。不需要,只需更改画笔的颜色属性。它不起作用,因为在绘图上下文中绘制的元素保持稳定,除非重新绘制。无论“保持稳定”是什么意思,我可以创建一个带有填充几何体的DrawingVisual,并精确渲染一次。当我稍后更改填充笔刷的颜色时,绘制的几何体会在屏幕上更改其颜色,而不会重新绘制。如果这对你不起作用,你肯定是做错了别的事情。我相信你。当然,我会挖掘我的代码,找出哪里出了问题,让你知道当我需要更改颜色时,BackgroundBrush会更新,并调用上面的颜色更改代码。这不是必需的,只需更改画笔的颜色属性。它不起作用,因为在绘图上下文中绘制的元素保持稳定,除非重新绘制。不管怎样“保持稳定“也就是说,我可以创建一个带有填充几何体的DrawingVisual,并精确渲染一次。当我稍后更改填充笔刷的颜色时,绘制的几何体会在屏幕上更改其颜色,而不会重新绘制。如果这对你不起作用,你肯定是做错了别的事情。我相信你。当然,我会挖掘我的代码,找出哪里出了问题,让你知道。好吧,它对我来说非常有效。也许你会发布更多的代码,比如
mBackGroundBrush
的声明,并在其中进行更改;非常感谢,我将笔刷实例更改为mBackGroundBrush=new SolidColorBrush(..),这是我的错误…Clemens,如何完全“擦除”已绘制的对象?
DrawingContext
类只有“draw”方法,没有其他方法(除了清除所有内容的Dispose()方法)。@Sabuncu Dispose方法只关闭DrawingContext,但不“清除”任何内容。为了从DrawingVisual中删除某个对象,通常需要进行完整的重画。嗯,这对我来说非常有效。也许你会发布更多的代码,比如
mBackGroundBrush
的声明,并在其中进行更改;非常感谢,我将笔刷实例更改为mBackGroundBrush=new SolidColorBrush(..),这是我的错误…Clemens,如何完全“擦除”已绘制的对象?
DrawingContext
类只有“draw”方法,没有其他方法(除了清除所有内容的Dispose()方法)。@Sabuncu Dispose方法只关闭DrawingContext,但不“清除”任何内容。为了从DrawingVisual中删除某个对象,通常必须进行完整的重画。