跨各种网格共享相同的FrameworkElement和DrawingVisuals实例(WPF .net 4)

时间:2011-03-26 20:23:14

标签: wpf drawing

我正在做一个应用程序,我使用PathFigure,LineSegment,...在FrameworkElement中存储为DrawingVisuals。

我需要在2个不同的UI元素(网格或面板,无论......)中显示相同的图形 一个将由用户用于绘制,第二个将允许可视化相同的绘图,缩放和滚动而不影响第一个UI元素视口。

我将拥有超过2000个DrawingVisuals,复制它们将是愚蠢的......

我目前正在摸索着找出最佳方法。 在您看来,什么是实现这一目标的正确解决方案?

更多信息:

我用一种简单的XAML

尝试了一种显而易见的方法
<Grid>
<StackPanel>
   <Border Name="B1" Background="Bisque" Width="400" Height="200"/>
   <Border Name="B2" Background="Beige" Width="400" Height="200"/>
 </StackPanel>
</Grid>

然后是一个简单的代码

var map = new VdMap();
B1.Child = map;

var elem = new ElementVisual(map);
elem.StartElement(20, 20);
elem.AddSegment(80, 60);
elem.AddSegment(10, 80);
elem.EndElement();
elem.Draw();

B2.Child = map;

VdMap是一个FrameworkElement

ElementVisual,StartElement,AddElement是我的内部函数。重要的是:

B1.Child = map; //I attach my Map to the border
B2.Child = map; //I try to attach the same FrameworkElement to the second border.

我得到运行时错误“指定元素已经是另一个元素的逻辑子元素。首先断开它。”

看起来好像比我想象的要难。

1 个答案:

答案 0 :(得分:0)

确定,

我可能找到了正确的方法:VisualBrush和Rectangle。

  var mapClone = new VisualBrush { Visual = map };

    rectangle = new Rectangle { 
         Width = 300, Height = 300, 
         Stroke = Brushes.Black, HorizontalAlignment = HorizontalAlignment.Left, 
         Fill = mapClone };

    B2.Children.Add(rectangle);

我现在在B2中有一张地图的可视化副本,我可以单独缩放和转换。

欢迎任何更好的主意。