7

我在资源字典中有一个 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-->

我现在使用上面的按钮控件绑定到2 个不同的 Windows .xaml 文件中的 ContentControl 控件的Content 属性,每个文件都有自己的,因此每个窗口都应该根据每个窗口的属性值显示上面的按钮控件,如下所示。WindowDataContextContentViewModel'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 窗口都具有来自资源的相同按钮控件实例,在两个窗口中都使用。

如何解决此问题,以便每个 Window 从资源中获取单独的按钮控件,并且仍然从它们自己的 ViewModel中显示不同的属性值?BoundText

编辑: 由于下面提到的原因MSDN,我不能使用 x:Shared="False" 属性来解决这个问题:

• 包含项目的ResourceDictionary 不得嵌套在另一个ResourceDictionary 中。例如,对于已经是 ResourceDictionary 项的 Style 中的 ResourceDictionary 中的项,您不能使用 x:Shared。

4

2 回答 2

8

您是否尝试使用该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 来显示它。

于 2013-02-13T09:12:08.803 回答
4

尝试:

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


<Button Style="{StaticResource buttonResource}" />
于 2013-02-13T09:11:07.173 回答