Невозможно использовать один и тот же ресурс на двух разных холстах - PullRequest
1 голос
/ 01 ноября 2011

У меня есть приложение с двумя элементами управления 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 Ответ

3 голосов
/ 01 ноября 2011

Установите атрибут x:Shared="False" для вашего ресурса.
Это 'true', поэтому wpf по умолчанию создает один ресурс (для оптимизации производительности).Когда вы устанавливаете его 'false' wpf создает новый экземпляр для запроса.
Есть примеры этого

...