我有一个带有两个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;
}
}
提前致谢!
答案 0 :(得分:3)
将属性x:Shared
="False"
设置为您的资源
它是'true'
所以wpf默认创建一个资源(用于优化性能)。设置'false'
时,wpf会根据请求创建新实例
There are sample of this