WPF findancestor 不在第二个 tabitem 上工作

WPF findancestor not working on second tabitem

相当简单的问题(我认为!)但我似乎找不到简单的答案。

我构建了一个测试 WPF 应用程序,其中包含一个选项卡控件和两个选项卡项。每个 tabitem 上都有一个按钮,它的内容绑定到存储在本地资源字典中的路径。路径的填充 属性 使用 FindAncestor 绑定按钮的前景 属性。

问题:在 tab1 上内容显示正确,但在 tab2 上根本不显示。如果我删除 FindAncestor 绑定并替换为画笔(例如,白色),两个按钮都会正确显示。

我希望我遗漏了一些简单的东西,因为这看起来应该是可能的。

代码:

<Window.Resources>
    <ResourceDictionary>
        <Path x:Key="TickIcon2" Fill="{Binding Foreground, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Control}}}" Stretch="Uniform" x:Shared="False"  Data="F1 M 23.7501,33.25L 34.8334,44.3333L 52.2499,22.1668L 56.9999,26.9168L 34.8334,53.8333L 19.0001,38L 23.7501,33.25 Z"/>
    </ResourceDictionary>
</Window.Resources>
<Grid>
    <TabControl>
        <TabItem Header="1">
            <Button Content="{DynamicResource TickIcon2}"  Width="50" Height="50" />
        </TabItem>
        <TabItem Header="2">
            <Button  Content="{DynamicResource TickIcon2}"  Width="50" Height="50" />
        </TabItem>
    </TabControl>
</Grid>

很可能与资源字典中资源的共享(默认)性质有关。

阅读:MSDN.

您可以尝试让资源不共享 (x:Shared=False)

<Path x:Key="TickIcon2" x:Shared="False" Fill="{Binding Foreground, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Control}}}" Stretch="Uniform" x:Shared="False"  Data="F1 M 23.7501,33.25L 34.8334,44.3333L 52.2499,22.1668L 56.9999,26.9168L 34.8334,53.8333L 19.0001,38L 23.7501,33.25 Z"/>

我找到了一个解决方案,以防有人遇到这个问题。如果我使用 'Binding' 而不是 'DynamicResourse',路径会在两个选项卡上正确显示:

<Grid>
    <TabControl>
        <TabItem Header="1">
            <Button Content="{Binding Mode=OneWay, Source={StaticResource TickIcon2}}"  Width="50" Height="50" />
        </TabItem>
        <TabItem Header="2">
            <Button  Content="{Binding Mode=OneWay, Source={StaticResource TickIcon2}}"  Width="50" Height="50" />
        </TabItem>
    </TabControl>
</Grid>