我有一个非常简单的WPF项目设置:
MyFoo.xaml看起来像:
<UserControl xmlns:bar="clr-namespace:WpfApplication1.UserControls" ...>
<Grid>
<bar:MyUserControl />
</Grid>
</UserControl>
Styles.xaml看起来像:
<Style TargetType="TextBlock">
<Setter Property="Foreground"
Value="Red" />
</Style>
MyUserControl.xaml看起来像:
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/Styles/Styles.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
<Grid>
<TextBlock Text="Hello world!" />
</Grid>
我的控件不会在设计时渲染,但在运行时它可以正常工作:
如屏幕截图所示,我收到错误:
找不到资源'styles / styles.xaml'。
我已经尝试将Styles.xaml的构建操作设置为“资源”并清理/构建,但它不起作用。
为什么会这样?我该如何解决?
答案 0 :(得分:4)
我能够复制这个问题。
理由落后:
xmlns:bar="clr-namespace:WpfApplication1.UserControls"
您专门为UserControls指定命名空间。由于您尝试合并MyUserControl
中使用位置(Source
)指定源的字典,因此可以找到资源;然而,Foo.MyFoo似乎并不知道在哪里看。无论设计者何时尝试在MyFoo中实例化MyUserControl,它都无法解析Styles.xaml资源的位置。
要修复它,
Styles
文件夹+ Styles.xaml
拖到UserControls
文件夹中。 MyUserControl.xaml
中修复您的源路径<ResourceDictionary Source="Styles/Styles.xaml" />
您现在可以在设计时看到您的控件。
修改强>
我找到了一种方法来保持项目不变并获得相同的结果。
Source
更改为/WpfApplication1;component/Styles/Styles.xaml
就构建动作之间的区别而言,here是一个很好的帖子。
在VS2012中,我获得了异常的StackTrace,最低级别似乎可能与Baml
相关(当Build Action设置为Page时创建Baml)。这是最内部的例外:
IOException: Cannot locate resource 'styles/styles.xaml'. at
MS.Internal.AppModel.ResourcePart.GetStreamCore(FileMode mode,
FileAccess access) at
System.IO.Packaging.PackagePart.GetStream(FileMode mode, FileAccess
access) at
System.IO.Packaging.PackWebResponse.CachedResponse.GetResponseStream()
at System.IO.Packaging.PackWebResponse.GetResponseStream() at
System.IO.Packaging.PackWebResponse.get_ContentType() at
MS.Internal.WpfWebRequestHelper.GetContentType(WebResponse response)
at MS.Internal.WpfWebRequestHelper.GetResponseStream(WebRequest
request, ContentType& contentType) at
System.Windows.ResourceDictionary.set_Source(Uri value) at
System.Windows.Baml2006.WpfSharedBamlSchemaContext. <Create_BamlProperty_ResourceDictionary_Source>b__1c4(Object
target, Object value) at
System.Windows.Baml2006.WpfKnownMemberInvoker.SetValue(Object
instance, Object value) at
MS.Internal.Xaml.Runtime.ClrObjectRuntime.SetValue(XamlMember member,
Object obj, Object value) at
MS.Internal.Xaml.Runtime.ClrObjectRuntime.SetValue(Object inst,
XamlMember property, Object value)
答案 1 :(得分:0)
这已经很老了,但我遇到了类似的问题,但没有类型的包URI解决了我的问题。 UserControl在运行时和设计者在编辑时工作,但它不能在另一个窗口中初始化,但仅在设计模式下。
我能够通过将所有文件名/路径设置为小写来解决问题。我不明白这如何解决Windows环境中的问题,但确实如此。甚至源字符串也不必区分大小写,只有文件和文件路径必须全部小写。
接受的答案是有效的,但在我的奇怪情况下,它并没有解决问题。也许我的经历可以帮助别人。