【问题标题】:Resource not found in ResourceDictionary for external control在 ResourceDictionary 中找不到用于外部控制的资源
【发布时间】:2017-11-17 10:41:54
【问题描述】:

问题

我想对项目 B 中定义的控件进行样式设置,但在项目 A 的页面上使用项目 A 中的样式。我决定通过使用包含在 MyCtrl.xaml 中使用的键的样式字典定义合并字典来实现。

我认为 MainPage 中使用的 MyCtrl 会在 XAML 树中找到正确的样式,如果它在自己的 xaml(更广泛的范围)中找不到它,但我得到了找不到名称/键的异常。是我做错了什么,还是这个想法不正确,我应该找到其他解决方案?

结构如下:

我有 2 个项目:

  • 项目 A - 具有 MainPage 页面和所有样式/资源的主应用程序。
  • 项目 B - 包含用户控件

项目 A 引用项目 B。

(项目 A)MainPage.xaml

<Page
   xmlns:ext="using:ProjB.Ctrls">
  <Page.Resources>
    <ResourceDictionary>
      <ResourceDictionary.MergedDictionaries>
         <ResourceDictionary Source="ms-appx:///SomeDir/MyCtrlStyles.xaml" />
         <ResourceDictionary Source="ms-appx:///SomeDir/MainPageStyles.xaml" />
      </ResourceDictionary.MergedDictionaries>
  </Page.Resources>
  …
  <ext: MyCtrl x:Id="myCtrlA" />
  …
</Page>

(项目 A)MainPageStyles.xaml

<ResourceDictionary>
  <Style x:Key="StyleAAA" />
</ResourceDictionary>

(项目 A)MainPageStyles.xaml

<ResourceDictionary>
  <Style x:Key="StyleBBB" BasedOn="{StaticResource BodyTextBlockStyle}" TargetType="TextBlock">
    <Setter Property="Margin" Value="24 13 12 0" />
  </Style>
</ResourceDictionary>

(项目 B)MyCtrl.xaml

<UserControl>
  <TextBlock x:Name="txtA" Style="{StaticResource StyleBBB}" Text="Text A" />
</ UserControl>

【问题讨论】:

    标签: xaml uwp resourcedictionary


    【解决方案1】:

    源路径的正确语法应该是:

    ms-appx:///[程序集]/[路径]/[资源文件]

    所以你应该将程序集名称添加到引用的程序集中,如下所示:

    <Page
       xmlns:ext="using:ProjB.Ctrls">
      <Page.Resources>
        <ResourceDictionary>
          <ResourceDictionary.MergedDictionaries>
             <ResourceDictionary Source="ms-appx:///MyCtrl/SomeDir/MyCtrlStyles.xaml" />
             <ResourceDictionary Source="ms-appx:///SomeDir/MainPageStyles.xaml" />
          </ResourceDictionary.MergedDictionaries>
      </Page.Resources>
      …
      <ext: MyCtrl x:Id="myCtrlA" />
      …
    </Page>
    

    【讨论】:

    • 关键问题是样式不在程序集B,而是在程序集A。只有自定义控件MyCtrl来自程序集B。
    【解决方案2】:
    <ext: MyCtrl x:Id="myCtrlA" />
    

    只是您的自定义控件的一个实例,位于不同的项目中,不知道您尝试使用的样式。

    由于您的自定义控件的 xaml 必须在实例化之前加载,它会在那时尝试查找资源 StyleBBB。找不到该资源,因为该资源不在任何可用的字典或 app.xaml 合并字典中。

    一些选项,按照我建议尝试的顺序。

    选项 1

    您应该尝试使用 DynamicResource。

    这将允许绑定在控件被放入页面时重新评估,因此它可以在运行时正确地查找它。

    DynamicResource 对性能的要求比较高,所以如果这是一个您计划始终创建数千个实例的控件,那么这可能是一个太大的权衡。

    选项 2

    将合并的字典放入您的 app.xaml 文件中。

    当无法在其他地方找到资源时,可以将此应用程序范围的资源字典视为后备查找。

    缺点是它可用于您应用程序中的所有内容,并且它仅适用于任何给定键的一个资源,因此您不能像通常那样在子控件中覆盖它。

    选项 3

    将项目A的引用添加到项目B中。将所需的字典合并到控件的资源中。

    这增加了一个你以前没有的依赖,而且它是循环的,所以尽量不要这样做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-21
      • 1970-01-01
      相关资源
      最近更新 更多