【发布时间】: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,然后将其放回原处。
-
成功了。很简单。谢谢你:)