【问题标题】:Canvas with BitmapCache - Render after removing child带有 BitmapCache 的画布 - 移除子元素后渲染
【发布时间】:2015-12-04 01:02:21
【问题描述】:

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

<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);

现在,当我这样做时,形状不会从画布上视觉上移除。它只是停留在那里。当我移动窗口或放大画布时,形状会消失。 所以,我的问题是,有没有办法在元素被删除后立即“渲染”画布?

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

  • oCanvas.UpdateLayout();
  • oCanvas.InvalidateVisual();
  • 验证删除操作是否正在调度程序上运行(它是)。
  • 在移除 CacheMode 时有效,但在处理多个形状时会失去性能。

【问题讨论】:

  • 移除缓存模式?
  • 嗨。如果我删除 CacheMode 它将起作用,但我确实有缓存模式,因此在添加多个形状时我可以在画布上获得良好的性能。
  • 然后在更改 Canvas 子项之前移除 CacheMode,然后将其放回原处。
  • 成功了。很简单。谢谢你:)

标签: wpf canvas render


【解决方案1】:

我已经解决了这个问题,方法是在更改 Canvas 子项之前删除 CacheMode,然后将其重新打开。

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

谢谢@Clemens。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-17
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 2020-12-05
    • 2018-04-19
    相关资源
    最近更新 更多