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>
测试以隔离此问题:
此代码编译并在运行时显示绿色,橙色和粉红色矩形,中间带有黄色文本(正如预期的那样)。
在XAML Designer中查看PanelChoice.xaml
会显示橙色和粉红色的矩形,中间带有黄色文字(正如预期的那样)。
但是,在设计器中查看MainWindow.xaml
会在Visual Studio错误列表窗格中显示Cannot create an instance of "PanelChoice"
并列出Cannot locate resource 'styles/mystyle.xaml'.
。
如果<ResourceDictionary Source="/Styles/MyStyle.xaml"/>
中的PanelChoice.xaml
行被移除(或已注释掉)并重建项目,则在设计器中查看MainWindow.xaml
会显示绿色,橙色和粉红色的矩形中间是黄色文字,没有错误信息。它在运行时表现为#1。
要验证MyStyle.xaml
是否已正确引用,可以删除<SolidColorBrush x:Key="FontColorKey" Color="Yellow" />
中的PanelChoice.xaml
行,而不是删除MyStyle.xaml
。这种情况表现为#1,但文本是深蓝色而不是黄色。这表明MyStyle.xaml
已正确引用且可访问。
注意:Visual Studio 2015和2017都表现出这种行为。
答案 0 :(得分:1)
取出.xaml引用中的前导/,使它看起来像这样:
<ResourceDictionary Source="Styles/MyStyle.xaml"/>
然后,当在设计师中时,控件可以在Window
中正确显示。
让它正确显示的另一种方法是使用完整的物理路径(你不会这样做,只是证明行为),例如:
<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
文件夹中。
这个问题似乎与设计师有关。当它提供一个必须“包含”你在“同一个”项目中创建的另一个控件的设计表面时,在引用具有前导/路径的那些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>