WPF findancestor не работает на втором табите

Довольно простая проблема (я думаю!), Но я не могу найти простой ответ на нее.

Я создал тестовое приложение WPF, которое содержит tabcontrol и два элемента tab. На каждой вкладке есть кнопка, и ее содержимое связано с путем, который хранится в словаре локальных ресурсов. Свойство "Заливка пути" связывается со свойством "Передний план" кнопки с помощью FindAncestor.

Проблема: на вкладке 1 контент отображается правильно, но на вкладке 2 он не отображается вообще. Если я удаляю привязку 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>

2 ответа

Решение

Я нашел решение на случай, если кто-то столкнется с этой проблемой. Если бы я использовал "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>

Скорее всего, это связано с общим (по умолчанию) характером ресурсов в словаре ресурсов.

читать: 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"/>
Другие вопросы по тегам