为什么资源文件在从Window引用时会从WPF Designer中“消失”?

时间:2017-04-21 21:55:01

标签: wpf xaml

Stackoverflow还有其他类似问题,但它们似乎与多个程序集中的使用情况或ResourceDictionary Source值的格式有关。此问题与单个程序集有关,最后列出的测试表明Source值按原样运行。

以下介绍了一个说明问题的小型测试应用程序。

测试应用程序有一个样式XAML文件(MyStyle.xaml):

<ResourceDictionary
    xmlns  ="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
>
    <SolidColorBrush x:Key="FontColorKey" Color="DarkBlue" />

</ResourceDictionary>

用户控件(PanelChoice.xaml)中使用的是:

<ToggleButton 
    x:Class="PanelNS.PanelChoice"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Height="30"  Width="100" Background="Orange"
>
    <ToggleButton.Resources>
        <ResourceDictionary >
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary  Source="/Styles/MyStyle.xaml"/>
            </ResourceDictionary.MergedDictionaries>
            <SolidColorBrush x:Key="FontColorKey" Color="Yellow" />
        </ResourceDictionary>
    </ToggleButton.Resources>

    <TextBlock 
        Foreground="{StaticResource FontColorKey}" 
        Background="Pink"  Text="Testing"
    />
</ToggleButton>

反过来,它在测试窗口(MainWindow.xaml)上使用:

<Window x:Class="IncludeStyleTest.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:PanelNS"
    Title="MainWindow" Height="200" Width="200"
>
    <Grid Background="Green">
        <local:PanelChoice />
    </Grid>
</Window>

测试以隔离此问题:

  1. 此代码编译并在运行时显示绿色,橙色和粉红色矩形,中间带有黄色文本(正如预期的那样)。

  2. 在XAML Designer中查看PanelChoice.xaml会显示橙色和粉红色的矩形,中间带有黄色文字(正如预期的那样)。

  3. 但是,在设计器中查看MainWindow.xaml会在Visual Studio错误列表窗格中显示Cannot create an instance of "PanelChoice"并列出Cannot locate resource 'styles/mystyle.xaml'.

  4. 如果<ResourceDictionary Source="/Styles/MyStyle.xaml"/>中的PanelChoice.xaml行被移除(或已注释掉)并重建项目,则在设计器中查看MainWindow.xaml会显示绿色,橙色和粉红色的矩形中间是黄色文字,没有错误信息。它在运行时表现为#1。

  5. 要验证MyStyle.xaml是否已正确引用,可以删除<SolidColorBrush x:Key="FontColorKey" Color="Yellow" />中的PanelChoice.xaml行,而不是删除MyStyle.xaml。这种情况表现为#1,但文本是深蓝色而不是黄色。这表明MyStyle.xaml已正确引用且可访问。

  6. 注意:Visual Studio 2015和2017都表现出这种行为。

1 个答案:

答案 0 :(得分:1)

取出.xaml引用中的前导/,使它看起来像这样:

<ResourceDictionary  Source="Styles/MyStyle.xaml"/>

然后,当在设计师中时,控件可以在Window中正确显示。

enter image description here

让它正确显示的另一种方法是使用完整的物理路径(你不会这样做,只是证明行为),例如:

<ResourceDictionary  Source="\Users\colin.smith\Documents\visual studio 2017\Projects\WpfApp15\WpfApp15\Styles\MyStyle.xaml"/>

是的另一种方式:

<ResourceDictionary  Source="/WpfApp15;component/Styles/MyStyle.xaml"/>

如果您使用属性选择器为Source选择ResourceDictionary,则在引用Source时,它不会在MyStyle.xaml的开头显示前导/位于Styles文件夹中。

enter image description here

这个问题似乎与设计师有关。当它提供一个必须“包含”你在“同一个”项目中创建的另一个控件的设计表面时,在引用具有前导/路径的那些ResourceDictionaries时,它必须做错了。

让它发挥作用的另一种方法......

如果您在单独的“用户控件”或“自定义控件”库中移动/创建“控件”,那么您将使用“包”引用来引用资源...以及{{1}将能够在设计器中正确显示该控件。

我相信你可以找到一个在他们自己的库中创建用户控件的例子......但是会很快显示出它的样子。

Window

然后添加对WpfControlLibrary1库的引用,并使用:

    <ToggleButton 
    x:Class="WpfControlLibrary1
.PanelChoice"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Height="30"  Width="100" Background="Orange"
>
        <ToggleButton.Resources>
            <ResourceDictionary >
                <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary  Source="pack://application:,,,/WpfControlLibrary1;component/Styles/MyStyle.xaml"/>
                </ResourceDictionary.MergedDictionaries>
                <SolidColorBrush x:Key="FontColorKey" Color="Yellow" />
            </ResourceDictionary>
        </ToggleButton.Resources>

        <TextBlock 
        Foreground="{StaticResource FontColorKey}" 
        Background="Pink"  Text="Testing"
    />
    </ToggleButton>