这里有一个非常基本的例子,我试图做什么,但不工作:
<StackPanel>
<StackPanel.Resources>
<Grid x:Key="MyYellowEllipse">
<Ellipse Width="50" Height="50" Fill="Yellow" />
</Grid>
<Grid x:Key="MyBlueEllipse">
<Ellipse Width="50" Height="50" Fill="Blue" />
</Grid>
</StackPanel.Resources>
<ContentPresenter Content="{StaticResource MyYellowEllipse}" />
<ContentPresenter Content="{StaticResource MyBlueEllipse}" />
<ContentPresenter Content="{StaticResource MyYellowEllipse}" />
<ContentPresenter Content="{StaticResource MyBlueEllipse}" />
<ContentPresenter Content="{StaticResource MyYellowEllipse}" />
<ContentPresenter Content="{StaticResource MyBlueEllipse}" />
</StackPanel>
由于某种原因,当我这样做时,只有最后两个被填充(尽管空间留给另一个)。我希望能够在多个内容演示者中重用相同的内容。
为什么我不能这样做,更重要的是,如果我想实现这一点,我应该如何做。
我已经在资源字典中的网格中使用Path和Polygon对象构建了一堆自定义字形,我想在我的应用程序中的多个地方显示它们,但它们只显示在一个用法中(就像我的示例一样)。我以为ContentPresenter就是为了这个。
编辑:这是一个解决方案
@emoacht在评论中指出,在资源定义中将x:Shared="False"
添加到Grid将解决这个问题。我现在要用这个解决方案。
为了我自己的启发;然而,我希望有人能向我解释A.)为什么需要这样做,以及B.)重用一个包含一堆<Polygon>
的<Grid>
的更合适的解决方案是什么。
1条答案
按热度按时间ax6ht2ek1#
@emoacht在评论中指出,将
x:Shared="False"
添加到资源定义中的Grid
将解决这个问题。我现在要用这个解决方案。为了我自己的启发;但是我希望有人能给我解释一下A.)为什么需要
因为WPF中的默认资源检索行为是为所有请求共享XAML资源的示例。你可以在docs中阅读更多。
和B.)重用一个包含一堆s的
<Grid>
的更合适的解决方案是什么。例如,您可以将
MyYellowEllipse
和MyBlueEllipse
定义为自定义类型:...并在XAML标记中使用它们,而不涉及任何资源:
显然,出于代码共享的原因,您也可以创建一个名为
MyEllipse
或其他的基类,但您已经明白了这一点。