无法在两个不同的画布中使用相同的资源

时间:2011-11-01 07:25:55

标签: c# .net wpf dll user-controls

我有一个带有两个Canvas控件的应用程序。当应用程序启动时,它从DLL加载一个UserControl,它基本上是Canvas,带有一堆XAML代码。

我希望能够在两个画布中显示这个控件,但是,当我使用ContentPresenter并将它在两个画布中绑定到从DLL加载的控件时,它只显示在一个画布上而另一个画布上没有吨。我想这与我在两个不同的画布中实际使用相同资源的事实有关,但是因为我想避免使用太多内存(从DLL加载的控件是非常沉重)我不想创建同一控件的两个副本。

对于这种情况,有没有人有更好的方法/解决方案?

这是用于在两个画布之一中显示加载的控件的XAML(另一个画布使用类似的代码)

<Canvas Width="{Binding MapModel.MapControl.Bounds.Width}" Height="{Binding MapModel.MapControl.Bounds.Height}">
    <Canvas.Background>
         <VisualBrush>
             <VisualBrush.Visual>
                  <ContentPresenter Content="{Binding MapModel.MapControl}" />
             </VisualBrush.Visual>
         </VisualBrush>
    </Canvas.Background>
 </Canvas>

从DLL加载是通过以下方式执行的:

  // Load the map library assembly (Using reflection)
  Assembly asm = Assembly.LoadFile(m_fileName);
  Type[] tlist = asm.GetTypes();

  // Find the class that represents the airport XAML drawing in the assembly, if it finds the airport class then 
  // set the value to be an instance of that class.
  foreach (Type t in tlist)
  {
    if (t.Name == "Map")
    {
      MapControl = Activator.CreateInstance(t) as UserControl;
      break;
    }
  }

提前致谢!

1 个答案:

答案 0 :(得分:3)

将属性x:Shared ="False"设置为您的资源 它是'true'所以wpf默认创建一个资源(用于优化性能)。设置'false'时,wpf会根据请求创建新实例 There are sample of this