使用BitmapCache的画布 - 删除子项后渲染

时间:2015-09-08 11:07:15

标签: wpf canvas render

我有一个包含以下元素的用户控件:

<UserControl
 ...>
  <ScrollViewer Name="LayoutScroll" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto">

    <Grid Name="MainGrid">
      <Canvas x:Name="LayerObjects" Panel.ZIndex="2"
       Width="{Binding ActualWidth,ElementName=MainGrid}" Height="{Binding ActualHeight, ElementName=MainGrid}">
            <Canvas.CacheMode>
                <BitmapCache 
                EnableClearType="False" 
                SnapsToDevicePixels="False"
                RenderAtScale="2"/>
            </Canvas.CacheMode>
        </Canvas>
    </Grid>

  </ScrollViewer>
</UserControl>

我使用此用户控件将多个形状绘制到其中。绘图工作得很好,删除工作也很好(我不知道我改变了什么,只是无法弄清楚)。 每次我想从这个画布中删除一个元素时,我只会这样做:

LayerObject.Children.Remove(shape);

现在,当我这样做时,从画布上看不到形状。它就在那里。当我移动窗口或放大到画布时,形状消失了。 所以,我的问题是,有没有什么方法可以'#34;渲染&#34;删除元素后的画布?

到目前为止我尝试了什么(没有成功):

  • oCanvas.UpdateLayout();
  • oCanvas.InvalidateVisual();
  • 验证调度程序上是否正在执行删除操作(确实如此)。
  • 如果删除了CacheMode但在处理多个形状时会失去性能,则可以正常工作。

1 个答案:

答案 0 :(得分:1)

我已经通过在更改Canvas子项之前删除CacheMode然后重新启用它来解决这个问题。

CacheMode oTempCM = oCanvas.CacheMode;
oCanvas.CacheMode = null;
//do canvas operations ...
oCanvas.CacheMode = oTempCM;

谢谢@Clemens。