由于无法找到资源,UserControl将不会在设计时呈现?

时间:2013-12-03 20:20:44

标签: wpf xaml

我有一个非常简单的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的构建操作设置为“资源”并清理/构建,但它不起作用。

为什么会这样?我该如何解决?

2 个答案:

答案 0 :(得分:4)

我能够复制这个问题。

理由落后:

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" />
  3. 您现在可以在设计时看到您的控件。

    修改

    我找到了一种方法来保持项目不变并获得相同的结果。

    1. 将Styles.xaml Build Action设置为Resource。
    2. Source更改为/WpfApplication1;component/Styles/Styles.xaml
    3. 重建
    4. 就构建动作之间的区别而言,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环境中的问题,但确实如此。甚至源字符串也不必区分大小写,只有文件和文件路径必须全部小写。

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