gpt4 book ai didi

wpf - 从 WinForms 托管的 WPF 控件加载/使用资源字典

转载 作者:行者123 更新时间:2023-12-04 02:18:09 25 4
gpt4 key购买 nike

我有一个需要在运行时托管 WPF 控件的 Windows 窗体应用程序。我已经完成了基本的托管和交互(使用 ElementHost 控件),并且一切正常,直到我尝试做一些需要 WPF 控件使用已定义的自定义资源字典的事情。 (WPF 控件及其所有资源字典都定义在同一个 WPF 控件库 DLL 中。)

一旦发生这种情况,我就会收到一堆看起来像这样的错误:

System.Windows.ResourceDictionary Warning: 9 : Resource not found; ResourceKey='DocumentHeaderInterestStyle'

我找到了一个 reference ( 链接由于归档 而出现死机, this 可能与最初引用的文章相同)。这谈到了这一点,但似乎这篇文章更多地从 WPF 方面处理事情,但我真的不想对 WPF 控件进行更改,因为一切都在独立的 WPF 应用程序中工作。

如果完成此操作的唯一方法是在 WPF 端进行更改,我可以进行这些更改(我不负责 WPF 控件库,但也为同一家公司工作的人,所以这不是问题其他而不是让他有时间进行更改。)但我希望我可以在 WinForms 方面做一些事情来让它发挥作用。

WPF 控件库在项目中定义了一个名为“Default.xaml”的资源字典文件,具有以下属性:

构建操作:页面
复制到输出目录:不要复制
自定义工具:MSBuild:Compile

独立 WPF 应用程序的 App.xaml 文件中有以下条目:
    <ResourceDictionary x:Uid="ResourceDictionary_1">
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary x:Uid="ResourceDictionary_2" Source="/SmartClient.Infrastructure;component/Themes\Default.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>

看起来控制库应该已经知道如何获取它的资源。使用 Resources.MergedDictionaries.Add() 似乎应该可以工作,但是我在哪里可以获得现有字典的实例?

最佳答案

假设您将样式/模板/资源分成许多文件Resources1.xamlResources2.xaml您可以将它们聚合到单个资源字典( AllResources.xaml )中。可以轻松地将资源字典添加到控件的 xaml 文件中的控件。请参见下面的示例。

(!) 设置 Resources1.xaml , Resources2.xamlAllResources.xaml 进行操作Page

资源1.xaml

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

<ControlTemplate x:Key="ScrollViewerControlTemplate" TargetType="{x:Type ScrollViewer}">
...
</ControlTemplate>

<LinearGradientBrush x:Key="VerticalScrollBarBackground" EndPoint="1,0" StartPoint="0,0">
...
</LinearGradientBrush>

<Style x:Key="StyleA" TargetType="{x:Type ScrollBar}">
...
</Style>

</ResourceDictionary>

资源2.xaml
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">


<Style x:Key="StyleB" TargetType="{x:Type ScrollBar}">
...
</Style>

<Style x:Key="StyleC" TargetType="{x:Type TextBlock}">
...
</Style>

</ResourceDictionary>

所有资源.xaml

将资源字典来源添加为 相对 路径 到 AllResources.xaml
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Resources1.xaml" />
<ResourceDictionary Source="Resources2.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>

最后在你的 UserControl
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/projectName;component/PathToTheFileRelativeToProjectRootDirectory/AllResources.xaml
<converters:StringToUpperCaseConverter x:Key="StringToUpperCaseConverter" />
<converters:LocalizationEntryToStringCaseConverter x:Key="LocalizationEntryToStringCaseConverter" />
</ResourceDictionary>
</UserControl.Resources>

关于wpf - 从 WinForms 托管的 WPF 控件加载/使用资源字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/579460/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com