Элементы управления WPF как StaticResource в словаре ресурсов, используемые в нескольких Windows WPF?

У меня есть элемент управления Button в качестве ресурса в словаре ресурсов, как показано ниже:

<!--ButtonResources.xaml file-->
<ResourceDictionary 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Button x:Key="buttonResource" Content={Binding BoundText}/>
</ResourceDictionary>
<!--ButtonResources.xaml file-->

Теперь я использую этот элемент управления кнопкой выше, привязанный к свойству Content элементов управления ContentControl в 2 разных файлах Windows .xaml, где каждый Window имеет свой собственный DataContext, и поэтому каждое окно должно отображать Content вышеуказанного элемента управления кнопки на основе его значения свойства ViewModel's BoundText, как показано ниже для каждого окна.

<Window x:Class="TestClass1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Window.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="ButtonResources.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Window.Resources>
    <Grid>
        <ContentControl Content={StaticResource buttonResource}/>
    </Grid>
</Window>

Но проблема в том, что оба окна отображают одинаковое значение для свойства BoundText, что означает, что обе WPF Windows имеют одинаковый экземпляр элемента управления кнопкой из ресурса, который используется как в Windows .

Как я могу решить эту проблему, чтобы каждое окно получало отдельный элемент управления кнопки от ресурса и по-прежнему отображало разные значения для свойства BoundText из своих собственная ViewModel?

Изменить: по причине, указанной в MSDN, как показано ниже, я не могу использовать атрибут x: Shared = "False" для решения этой проблемы:

• ResourceDictionary, содержащий элементы, не должен быть вложен в другой ResourceDictionary. Например, вы не можете использовать x: Shared для элементов в ResourceDictionary, который находится в Style, который уже является элементом ResourceDictionary.


person VSS    schedule 13.02.2013    source источник


Ответы (2)


Вы пробовали использовать атрибут x:Shared?

<ResourceDictionary 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Button x:Shared="False" x:Key="buttonResource" Content={Binding BoundText}/>
</ResourceDictionary>

Дополнительную информацию см. здесь.

Если это не сработает, вы можете сохранить шаблон в своем ресурсе вместо кнопки и использовать ContentControl внутри вашего окна для его отображения.

person Alex Shtof    schedule 13.02.2013
comment
Спасибо. Но я не могу использовать этот атрибут в качестве причины, упомянутой в моей части вопроса Изменить:. - person VSS; 13.02.2013
comment
И вы используете приведенный выше пример, вы должны использовать следующий тег. ‹StaticResource ResourceKey = buttonResource /› - person Loman; 30.07.2013
comment
Отлично, x: Shared просто решил мою проблему с целью совместного использования одного элемента управления между разными представлениями. - person usefulBee; 22.04.2014

Попробуйте:

<Style TargetType="Button" x:Key="buttonResource">
    <Setter Property="Content" Value="{Binding BoundText}" />
</Style>


<Button Style="{StaticResource buttonResource}" />
person KBoek    schedule 13.02.2013
comment
Спасибо. Я обновил свой вопрос, чтобы включить использование Content Control, как связать ContentControl в каждом окне WPF (.xaml) с ресурсом Button в словаре ресурсов в соответствии с приведенным выше ответом? - person VSS; 13.02.2013
comment
Я не понимаю, как бы это было по-другому. Можете ли вы опубликовать код вашего ContentControl? - person KBoek; 13.02.2013
comment
Я добавил код для использования ContentControl в оба файла Window.xaml. Фактическое использование - это не кнопка, а другой элемент управления, и это потому, что мы хотим изменить файл xaml ресурса в будущих версиях без изменения Window.xaml код файла ... - person VSS; 13.02.2013
comment
В примере, который я написал, buttonResource больше не является кнопкой, а является стилем, поэтому вы не можете использовать его для свойства Content ContentControl. В этом случае вам следует попробовать пример кода из @Alex и установить для атрибута x: Shared значение false. - person KBoek; 13.02.2013