使用 WPF 自定义控件库 (.NET Framework) 中普通 WPF 项目中的 App.xaml

2023-12-12

我有一个 WPF 项目App.xaml(不是资源字典)带有一些材料设计的东西和一个 ViewModelLocator(MVVM),如下所示:

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Light.xaml">
            </ResourceDictionary>
            <ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Defaults.xaml">
            </ResourceDictionary>
            <!--<ResourceDictionary Source="pack://application:,,,/MaterialDesignColors;component/Themes/Recommended/Primary/MaterialDesignColor.DeepPurple.xaml">
            </ResourceDictionary>
            <ResourceDictionary Source="pack://application:,,,/MaterialDesignColors;component/Themes/Recommended/Accent/MaterialDesignColor.Lime.xaml">
            </ResourceDictionary>-->
            <!-- primary color -->
            <ResourceDictionary>
                <!-- include your primary palette -->
                <ResourceDictionary.MergedDictionaries>
                    <ResourceDictionary Source="pack://application:,,,/MaterialDesignColors;component/Themes/MaterialDesignColor.teal.xaml">
                    </ResourceDictionary>
                </ResourceDictionary.MergedDictionaries>
                <!--
                        include three hues from the primary palette (and the associated forecolours).
                        Do not rename, keep in sequence; light to dark.
                    -->
                <SolidColorBrush x:Key="PrimaryHueLightBrush"
                                 Color="{StaticResource Primary100}" />
                <SolidColorBrush x:Key="PrimaryHueLightForegroundBrush"
                                 Color="{StaticResource Primary100Foreground}" />
                <SolidColorBrush x:Key="PrimaryHueMidBrush"
                                 Color="{StaticResource Primary500}" />
                <SolidColorBrush x:Key="PrimaryHueMidForegroundBrush"
                                 Color="{StaticResource Primary500Foreground}" />
                <SolidColorBrush x:Key="PrimaryHueDarkBrush"
                                 Color="{StaticResource Primary700}" />
                <SolidColorBrush x:Key="PrimaryHueDarkForegroundBrush"
                                 Color="{StaticResource Primary700Foreground}" />
            </ResourceDictionary>
            <!-- secondary colour -->
            <ResourceDictionary>
                <!-- include your secondary pallette -->
                <ResourceDictionary.MergedDictionaries>
                    <ResourceDictionary Source="pack://application:,,,/MaterialDesignColors;component/Themes/MaterialDesignColor.teal.xaml">
                    </ResourceDictionary>
                </ResourceDictionary.MergedDictionaries>
                <!-- include a single secondary accent color (and the associated forecolour) -->
                <SolidColorBrush x:Key="SecondaryAccentBrush"
                                 Color="{StaticResource Accent200}" />
                <SolidColorBrush x:Key="SecondaryAccentForegroundBrush"
                                 Color="{StaticResource Accent200Foreground}" />
            </ResourceDictionary>
            <!-- Include the Dragablz Material Design style -->
            <ResourceDictionary Source="pack://application:,,,/Dragablz;component/Themes/materialdesign.xaml">
            </ResourceDictionary>

            <ResourceDictionary Source="Resources/CustomMaterialDesignControls.xaml" />

        </ResourceDictionary.MergedDictionaries>
        <!-- tell Dragablz tab control to use the Material Design theme -->
        <Style TargetType="{x:Type dragablz:TabablzControl}"
               BasedOn="{StaticResource MaterialDesignTabablzControlStyle}" />
        <vm:ViewModelLocator x:Key="Locator"
                             d:IsDataSource="True"
                             xmlns:vm="clr-namespace:**WPFProject**.ViewModels" />
    </ResourceDictionary>
</Application.Resources>

当我在 WPF 项目中创建一个窗口时,它工作得非常完美。

但我还有一个 WPF 自定义库项目。如何在自定义 WPF 项目中访问 WPF 项目的 App.xaml。

这是自定义 WPF 库项目中的 Window.xaml:

<Window x:Class="**CustomWPFLibrary**.Views.PersonView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
    xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
    TextElement.Foreground="{DynamicResource MaterialDesignBody}"
    TextElement.FontWeight="Regular"
    TextElement.FontSize="12"
    TextOptions.TextFormattingMode="Ideal"
    TextOptions.TextRenderingMode="Auto"
    Background="{DynamicResource MaterialDesignPaper}"
    FontFamily="{DynamicResource MaterialDesignFont}"
    Title=" eFenKa - PERSONEN"
    WindowStyle="SingleBorderWindow"
    ResizeMode="CanResize"
    WindowStartupLocation="CenterScreen"
    WindowState="Maximized"
    DataContext="{Binding PersonViewModel, Mode=OneWay, Source={StaticResource Locator}}">
<Grid>

</Grid>

Locator和MaterialDesign的东西无法解决。有任何想法吗?或者这有可能吗?


TL;DR:我举了一个例子GitHub


Edit:另一位 GitHub 用户发表了一篇关于这个主题的不错的文章:article.


问题

有两个项目,您希望在两个项目的设计器中显示样式。概括来说:

  • a WPF应用程序项目(Windows应用程序的输出类型)
  • a 自定义控件项目(类库的输出类型)

一个办法

我看到帖子暗示App.xaml文件被共享。根据完成方式的不同,可能会创建循环依赖关系,或者尝试强制类库包含 ApplicationDefinition 时可能会遇到问题。因此,我建议您将样式分离到第三个项目中。您的解决方案结构现在将如下所示:

  • a WPF应用程序项目(Windows应用程序的输出类型)
  • a 自定义控件项目(类库的输出类型)
  • a 风格项目项目(类库的输出类型)

使这些样式出现在设计视图中自定义控件项目并供您使用WPF应用程序:

  1. 与往常一样,在进行更改之前备份您的解决方案(以防万一出现问题)。
  2. In your 风格项目,创建一个新的资源字典。这将是合并所有其他样式和资源的字典,因此请适当命名。
  3. 将您在 App.xaml 中定义的所有与样式相关的资源剪切并粘贴到新的资源字典中。
  4. In your WPF应用程序项目中,在 App.xaml 文件中引用新的资源字典。您的应用程序现在应该看起来像开始进行更改之前一样。
  5. In your 自定义控件项目中,创建一个新的 ResourceDictionary 名为DesignTimeResources.xaml在下面Properties folder.
  6. 构建您的解决方案。Note:你真的只需要构建自定义控件此时的项目。
  7. 您现在必须编辑自定义控件csproj。Note:您可能需要卸载项目才能从 Visual Studio 中执行此操作。
  8. In CustomControls.csproj, 搜索DesignTimeResources.xaml。您应该找到一个如下所示的块:
<Page Include="Properties\DesignTimeResources.xaml">
    <SubType>Designer</SubType>
    <Generator>MSBuild:Compile</Generator>
</Page>
  1. 将步骤 8 中的块替换为以下内容:
<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>
  1. 现在重新加载/构建自定义控件项目。
  2. 添加对 ResourceDictionary 的引用风格项目 to the DesignTimeResources.xaml您刚刚创建的文件。
  3. 重建您的解决方案。

您现在应该在设计器中看到您的样式自定义控件项目!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 WPF 自定义控件库 (.NET Framework) 中普通 WPF 项目中的 App.xaml 的相关文章

随机推荐

  • Cin 在 while 循环中

    因此 我环顾四周 无法弄清楚在 While 循环期间 cin 发生了什么 我正在阅读 C Primer 第 5 版 一书 我注意到在其中一个练习中 我无法使用 cin 来获取字符串 除非它不终止 while 循环 我仅使用 getline
  • 水平和垂直滚动 HTML 表格,同时左列固定

    我正在尝试创建一个HTML表在哪里身高有限水平滚动时左侧保持固定 并且表格主体可水平滚动 但垂直滚动时左侧不固定 左侧将与表格的其余部分一起滚动 fixed scrollable 1 body content 2 body content
  • 在 jquery 中处理 $(window).scroll 函数的更有效方法?

    在下面的代码中 我检查窗口是否滚动超过某个点 如果是 则更改元素以使用固定位置 以便它不会滚动到页面顶部 唯一的问题是 这似乎是高度客户端内存密集型 并且确实降低了滚动速度 因为在每个滚动像素上 我都会一遍又一遍地更新元素上的样式属性 在尝
  • 如何使用 Cognito 身份池生成临时凭证来访问 aws 服务?

    我有一个认知用户池和身份池 我有创建了一个用户在用户池中 我使用 lambda 获取令牌 即访问 刷新 id 令牌对于该用户 现在我想要生成临时凭证即该用户访问 AWS 服务的访问密钥和秘密访问密钥 我怎么能这样做呢 这是我用来生成令牌的代
  • 如何优化这个复杂的EAV MYSQL查询?

    是否可以优化我写的这个查询 我创建了一种动态虚拟数据库 使我的用户能够添加自定义字段而不影响数据库结构 这是迄今为止结构的非常简化的视图 tables columns db cases caseid db structure fieldna
  • R POSIXct 返回 NA 为“03/12/2017 02:17:13”

    我有一个包含以下日期以及其他几个日期的数据集 03 12 2017 02 17 13 我想将整个数据集放入数据表中 所以我使用read csv and as data table创建DT 其中包含date中的日期 时间信息 接下来我用了 D
  • 使用 SSE 将向量乘以常数

    我有一些在 4D 向量上运行的代码 目前我正在尝试将其转换为使用 SSE 我在 64b linux 上同时使用 clang 和 gcc 仅对向量进行操作就可以很好地理解这一点 但现在我必须将整个向量乘以一个常数 像这样 float y 4
  • 如何将 .xls 文件转换为 .csv 文件?

    如何转换 xls to csv在 Perl 中 这个模块是什么 有这方面的例子吗 最好的转换方式是什么 use Spreadsheet ParseExcel my xlsparser Spreadsheet ParseExcel gt ne
  • 使用 jQuery 切换同级元素

    我想切换列表中链接的下一个同级链接 如下所示 ul li a href 1 a li li a href 2 a ul class selected li a href 2 1 a li li a href 2 2 a li li a hr
  • 使用 BULK INSERT 命令将 CSV 文件导入 SQL Server 表

    我有 CSV 文件 其中有几个数据列 CSV 文件看起来像 字段1 测试1字段2 测试2字段3 测试3 测试4 测试5 在这种情况下 我可以使用哪个库作为字段终止符 我的意思是如果我使用此查询将 CSV 文件插入到shopifyitem表
  • 如何覆盖 CSS 类的属性以避免复制和重命名样式

    我对 CSS3 相当陌生 我希望能够执行以下操作 当我将一个类添加到元素中时 它会覆盖该特定元素中使用的另一个类的属性 假设我有 a class left carousel control href carousel 我希望能够添加一个名为
  • UIImageView动画消耗内存太多

    我的记忆和动画图像有问题 首先 我正在使用 ARC 在我的初始屏幕上 我有大约 60 个要制作动画的图像 我正在使用此代码进行动画 NSMutableArray images NSMutableArray alloc init int an
  • 常量文件中的 codeigniter base_url

    目前我通过以下方式显示图像 img src USER UPLOAD URL 在 application config constants php 中定义 define USER UPLOAD URL uploads user uploads
  • 使用 XSLT 将输入 XML 转换为其他 XML

    我是初学者 想学习 XSLT 我遇到了使用 XSLT 将输入 XML 文件转换为另一个 XML 文件的问题 我的输入 XML 文件
  • 为什么React-router在url改变时不重新渲染页面也不更新数据?

    我正在 React 中构建一个项目 该项目通过自定义挂钩从 API 检索数据 一旦检索到数据 它就会显示卡片 通过单击它们可以打开描述性页面 到这里一切都好 App js
  • 如何从 WebMatrix 2 Beta 中的 vsdoc 文件引用获取 JavaScript Intellisense?

    我将 JavaScript 文件从 Visual Studio 复制到新的 WebMatrix 2 Beta 项目 结果发现 vsdoc 文件没有用于 JavaScript Intellisense
  • Android背景隐藏子视图文本

    我有一个简单的 LinearLayout 当我添加安卓 背景对于 LinearLayout TextView不再可见 我不明白什么
  • PHP CSV 字符串到数组

    我正在尝试将 CSV 字符串解析为 PHP 中的数组 CSV 字符串具有以下属性 Delimiter Enclosure New line r n 示例内容 12345 Computers Acer 4 Varta 5 93 1 0 04
  • Oracle WITH 和 MATERIALIZE 提示充当函数的自主事务

    在 Oracle 12c 中 如果我在查询中调用在 WITH AS 部分中使用 MATERIALIZE 提示的函数 则该函数调用的行为类似于自治事务 DROP TABLE my table CREATE TABLE my table my
  • 使用 WPF 自定义控件库 (.NET Framework) 中普通 WPF 项目中的 App.xaml

    我有一个 WPF 项目App xaml 不是资源字典 带有一些材料设计的东西和一个 ViewModelLocator MVVM 如下所示