XAML WPF多个ContentPresenters相同的内容-仅填充1个

eufgjt7s  于 2023-09-28  发布在  其他
关注(0)|答案(1)|浏览(107)

这里有一个非常基本的例子,我试图做什么,但不工作:

<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>的更合适的解决方案是什么。

ax6ht2ek

ax6ht2ek1#

@emoacht在评论中指出,将x:Shared="False"添加到资源定义中的Grid将解决这个问题。我现在要用这个解决方案。为了我自己的启发;但是我希望有人能给我解释一下
A.)为什么需要
因为WPF中的默认资源检索行为是为所有请求共享XAML资源的示例。你可以在docs中阅读更多。
和B.)重用一个包含一堆s的<Grid>的更合适的解决方案是什么。
例如,您可以将MyYellowEllipseMyBlueEllipse定义为自定义类型:

public class MyYellowEllipse : Grid
{
    public MyYellowEllipse()
    {
        Children.Add(new Ellipse() { Width = 50, Height = 50, Fill = Brushes.Yellow });
    }
}

public class MyBlueEllipse : Grid
{
    public MyBlueEllipse()
    {
        Children.Add(new Ellipse() { Width = 50, Height = 50, Fill = Brushes.Blue });
    }
}

...并在XAML标记中使用它们,而不涉及任何资源:

<StackPanel>
    <local:MyYellowEllipse />
    <local:MyBlueEllipse />
    <local:MyYellowEllipse />
    <local:MyBlueEllipse />
    <local:MyYellowEllipse />
    <local:MyBlueEllipse />
</StackPanel>

显然,出于代码共享的原因,您也可以创建一个名为MyEllipse或其他的基类,但您已经明白了这一点。

相关问题