【问题标题】:XAML Intellisense doesn't work for Referenced Assembly ResourcesXAML Intellisense 不适用于引用的程序集资源
【发布时间】:2018-04-11 15:32:37
【问题描述】:

我正在尝试创建一个包含核心样式、资源、控件等的项目 dll 文件。然后将其引用到各种其他项目中,以用作统一外观的图形基础。

无论如何,我已经设置了图形项目,并且可以在其他项目中使用它,而且它似乎都可以正确显示。但是,我的静态资源的 XAML 智能感知似乎不起作用。

这是我的资源字典参考:

<ResourceDictionary Source="pack://application:,,,/BIT.GraphicElements;component/BITCoreStyles.xaml" />

如您所见,我使用包表示法在其程序集中引用它。我可以像我期望的那样设置元素的样式(StButtonAction 在上面的字典中):

Style="{StaticResource StButtonAction}"

但是,我必须手动输入。 Intellisense 没有将其作为选项提供,但如果我手动键入它会成功应用它。如果我将项目添加到解决方案并在那里引用它,它也可以工作,但是这旨在供那些不一定有权访问图形项目的人使用,因此从长远来看这不是一个好的解决方案......

我错过了什么?有没有办法让 Intellisense 为这些工作?

【问题讨论】:

  • 总是有点不确定。我有点习惯这并不总是有效。我现在刚刚尝试过,但它在我拥有的 sln 中对我有用。是 app.xaml 中的合并吗?
  • 您使用的是哪个视觉工作室?
  • 没有两个解决方案都是库,所以没有 app.xaml。使用 VS 社区 2017。
  • 您可能还需要将该资源字典专门设置为设计器资源。
  • 你是怎么做到的?

标签: wpf xaml intellisense resourcedictionary


【解决方案1】:

也许这对未来的搜索者有帮助,即使它不能解决您的具体问题。 当您有一个涉及外部 dll 的解决方案时,您偶尔会发现资源在设计时没有被加载。完全没有。即使您在 app.xaml 中合并,也不会在您运行之前出现。
对我来说,它看起来像是某种微妙的错误。

我解决此问题的方法是使用最初为 Blend 设计的功能。我们现在在 Visual Studio 中使用混合设计器。

在解决方案资源管理器中,将资源字典添加到属性。是的。特性。首先在您的项目中创建它并将其拖到那里。这必须称为 DesignTimeResources。然后,这可以合并您只想在设计时使用的任何资源字典,或者当您遇到问题时,您会认为资源字典没有在设计时加载。 我的在军队编辑器中,但使用来自引用的 dll,UILIb 的资源。它看起来像:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:local="clr-namespace:ArmyEditor">
    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="pack://application:,,,/UILib;component/Resources/UILibResources.xaml"/>
    </ResourceDictionary.MergedDictionaries>
</ResourceDictionary>

这是一个有点奇怪的资源字典,但到目前为止没有什么特别奇怪的。

接下来是许多开发人员永远不会做的事情 - 编辑您的 csproj。

右键单击您的项目并选择卸载。
再次右键单击它并编辑它。

在那里,您将获得构成您项目的所有内容的条目。当然,打破它会很糟糕,所以也许你想先备份。

如果你不使用混合,那么我认为这里重要的是添加一个节点,上面写着 ContainsDesignTimeResources True,但这是我的:

<Page Include="Properties\DesignTimeResources.xaml" Condition="'$(DesignTime)'=='true' OR ('$(SolutionPath)'!='' AND Exists('$(SolutionPath)') AND '$(BuildingInsideVisualStudio)'!='true' AND '$(BuildingInsideExpressionBlend)'!='true')">
  <Generator>MSBuild:Compile</Generator>
  <SubType>Designer</SubType>
  <ContainsDesignTimeResources>true</ContainsDesignTimeResources>
</Page>

保存您的编辑。
重新加载您的项目。
当设计器打开时,您应该会发现其中的资源已加载。也许这将有助于智能感知找到它们。

我之前提到过,但是.. 根据我的经验,这种对资源的智能感知通常是不可靠的。

这绝对解决了我在此解决方案中遇到的类似问题。当您想临时覆盖资源字典以进行本地化/品牌测试时,它也很有用。

【讨论】:

  • 不幸的是,它似乎对我不起作用。但是,我仍然赞成有两个原因。首先是努力扩展:)。其次,虽然,我对 .csproj 文件做了一些编辑(不是很多,而是一点点),我从来没有新的你可以在 VS 中卸载和编辑,我正在关闭并在记事本中编辑......刚刚保存我花了一些时间,教会了我一些东西:)。
  • FWIW,我一般使用“在文件资源管理器中打开文件夹”并使用外部编辑器编辑项目文件。当我返回 VS 时,会发现更改并重新加载项目。
猜你喜欢
  • 2019-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多