用户控件无法在设计时渲染,因为找不到资源?

5

我有一个非常简单的WPF项目,设置如下:

enter image description here

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>

我的控件无法在设计时渲染,但在运行时正常工作:

enter image description here enter image description here

如屏幕截图所示,我收到以下错误:

找不到资源 'styles/styles.xaml'。

我已经尝试将 Styles.xaml 的构建操作设置为“Resource”,并进行清理/重建,但并没有起作用。

为什么会发生这种情况? 我该如何解决?


ResourceDictionaries 应该将它们的 Build Action 设置为 Page - Federico Berasategui
你的项目目录树是什么?你可能应该使用../styles/styles.xaml。 - Flot2011
2个回答

5
我成功复制了这个问题。
原因是:
xmlns:bar="clr-namespace:WpfApplication1.UserControls"

您指定了命名空间,仅限于UserControls。由于您正在尝试合并在MyUserControl中使用位置(Source)查找资源的字典,它可以找到该资源;但是,似乎Foo.MyFoo不知道要查找的位置。当设计器尝试在MyFoo中实例化MyUserControl时发生了什么,它无法解析Styles.xaml资源的位置。
为了修复这个问题: 1.将Styles文件夹+Styles.xaml拖动到UserControls文件夹中。 2.在MyUserControl.xaml中将源路径修正为<ResourceDictionary Source="Styles/Styles.xaml" />。 现在您可以在设计时看到控件。
编辑: 我找到了一种方法来保持项目不变,并获得相同的结果。 1.将Styles.xaml生成操作设置为资源。 2.将源更改为/WpfApplication1;component/Styles/Styles.xaml。 3.重新生成。 就生成操作之间的区别而言,在此处是一个很好的帖子。 在VS2012中,我获取异常的StackTrace,最低级别似乎与Baml有关(当生成操作设置为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)

0

这篇文章有些老了,但我曾经遇到过类似的问题,但是没有任何类型的打包URI可以解决我的问题。当我在运行时和设计模式下编辑它时,UserControl可以正常工作,但是在另一个窗口中无法初始化,只能在设计模式下进行。

我通过将所有文件名/路径改为小写来解决问题。我不明白在Windows环境下如何解决这个问题,但它确实解决了。甚至源字符串也不必区分大小写,只需文件和文件路径全部小写即可。

接受的答案是有效的,但在我的奇怪情况下,它没有解决问题。也许我的经验可以帮助其他人。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接