OhB*_*ise 9 c# wpf resourcedictionary visual-studio-2015
TLDR;
屏幕ResourceDictionary在运行时正确地引用VS2015样式的外部文件,但不是在设计时.是什么赋予了?
在工作中,我们有一个WinForms产品,其中包含许多 WinForms屏幕,一个开发人员主动添加新的屏幕,以及一些WPF屏幕,我添加了新的.在现有的WPF屏幕中注意到很多重复的代码/样式,我创建了一个单独的项目来容纳这个 - 由所有现有/未来的WPF屏幕引用.
项目: WpfHelper
WpfHelper.dll 部署到 ...\Trunk\Project\Externals...\Trunk\Utilities\WpfHelper\WpfHelper\Resources\GlobalResources.xaml
我已...\Trunk\Project\Externals\WpfHelper.dll在六个项目中引用,将以下代码添加到每个资源文件中:
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/WpfHelper;Component/Resources/GlobalResources.xaml" />
</ResourceDictionary.MergedDictionaries>
Run Code Online (Sandbox Code Playgroud)
所有屏幕都位于...\Trunk\Project\Plugins.
????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
? ? Resource Works? ? Platform Target ? Target Framework ? Reference File Path ?
????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
? Project1 ? Succeeded ? Any CPU ? .NET 4.6 ? ...\Project1\Project1\Resources\Resources.xaml ?
? Project2 ? Succeeded ? x86 ? .NET 4.6 ? ...\Project2\Project2\Resources\Resources.xaml ?
? Project3 ? Succeeded ? Any CPU ? .NET 4.6 ? ...\Project3\Project3\Resources\Resources.xaml ?
? Project4 ? Failed ? x86 ? .NET 4.6 ? ...\Project4\Project4\Resources\Resources.xaml ?
? Project5 ? Failed ? x86 ? .NET 4.6 ? ...\Project5\Project5\Resources\Resources.xaml ?
? Project6 ? Failed ? Any CPU ? .NET 4.6 ? ...\Project6\Project6\Resources\Resources.xaml ?
????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)
近期变动
就在最近,我将Visual Studios 2013升级到2015年.大约在同一时间,另一个屏幕开发人员将所有现有的屏幕项目的目标框架从.NET Framework 3.5/4.0升级到.NET Framework 4.6.
成功的项目
WpfHelper.dll在最近的变化之前引用过.项目失败
WpfHelper.dll在最近的变化后引用了.查找资源字典"pack:// application ,,,/WpfHelper; component/Resources/GlobalResources.xaml"时发生错误.
Resources.xaml,抛出后续错误:
值不能为空.参数名称:item
我尝试过的:
阅读了大量文章和问答后:
我尝试了以下所有方面无济于事:
检查每个项目的AssemblyInfo.cs文件.失败的项目包括(并删除)以下内容:
[assembly: ThemeInfo(ResourceDictionaryLocation.None, ResourceDictionaryLocation.SourceAssembly)]
Run Code Online (Sandbox Code Playgroud)手动清除AppsData,Cleaned和Rebuilt项目中的临时文件夹.
WpfHelper.dll工作项目中复制的引用,并粘贴到失败项目的引用中.WpfHelper.Resources.GlobalResources.xaml链接文件添加到失败的项目中.GlobalResources.xaml.我没有想法,迷失在研究中.我模板的工作解决方案之一,使用了用于创建新的屏幕-这创造了新的屏幕,其成功地显示在设计时.这是关于这些预先存在的屏幕的东西.如何让失败的项目在设计时正确显示样式化资源?
我已经找到了解决这个问题的方法,只需付出很少的努力即可实现。
首先为资源字典添加一个代码隐藏文件 GlobalResources.xaml.cs:
namespace YourNamespaceHere
{
partial class GlobalResources : ResourceDictionary
{
public GlobalResources()
{
InitializeComponent();
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后将 x:Class 属性设置为 GlobalResources.xaml 中的 ResourceDictionary 标记:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="YourNamespaceHere.GlobalResources">
Run Code Online (Sandbox Code Playgroud)
您现在可以像这样创建资源字典的实例:
new YourNamespaceHere.GlobalResources()
Run Code Online (Sandbox Code Playgroud)
在使用资源字典的 WPF 用户控件中,将以下内容添加到 UserControl1.xaml.cs 的构造函数中:
public UserControl1()
{
if (DesignerProperties.GetIsInDesignMode(this))
this.Resources.MergedDictionaries.Add(new YourNamespaceHere.GlobalResources());
InitializeComponent();
}
Run Code Online (Sandbox Code Playgroud)
现在,使用 UserControl1 的控件的 WinForms 设计器将不再抱怨找不到包含资源字典的 dll。使用的资源也将显示在设计器中。
为了确保 WPF 设计器将显示 UserControl1 中使用的资源字典中的内容,您仍然需要在 UserControl1.xaml 中添加以下内容:
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/MyDll;component/GlobalResources.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
Run Code Online (Sandbox Code Playgroud)
MyDll 是包含资源字典的程序集的名称。在此示例中,GlobalResources.xaml 和 GlobalResources.xaml.cs 应放置在程序集的根级别(而不是文件夹中)。
| 归档时间: |
|
| 查看次数: |
988 次 |
| 最近记录: |