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

本文关键字:布中使 资源 两个 | 更新日期: 2023-09-27 18:12:51

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

我希望能够在两个画布中显示此控件,然而,当我使用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;
    }
  }

提前感谢!

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

将属性x:Shared ="False"设置为资源
它是'true',所以wpf默认创建一个资源(优化性能)。当您设置它'false'时,wpf为每个请求创建新实例。