WPF 类和相应的视觉样式继承

2024-02-13

我已经看过,但显然在与类和样式相关时无法获得正确的语法。我有具有特定行为的控件。我派生出一些来添加额外的行为。现在,我想要一个与每个版本相对应的样式。在最简单的示例中,我将忽略这些类,因为我知道样式与视觉影响具体相关,而不是与功能影响相关。之前的一些问题很接近,但我仍然遗漏了一些东西。

public class MyLabel : Label
{}

public class MyLabel2 : MyLabel
{}

所以从上面来看,我的资源字典中应该可以有 3 种样式。一个用于通用“Label”,一个用于我有一个派生自“MyLabel”的控件的情况,另一个用于“MyLabel2”。 “local:”根据“Theme”xaml 声明指向我的类库。

<Style x:Key="baseLabel" TargetType="Label">
   <Setter Property="FontSize" Value="10" />
</Style>

<Style x:Key="styleMyLabel" TargetType="local:MyLabel"  BasedOn="{StaticResource baseLabel}" >
   <Setter Property="FontSize" Value="14" />
</Style>

<Style x:Key="styleMyLabel2" TargetType="{x:Type local:MyLabel2}" BasedOn="{StaticResource styleMyLabel}" >
   <Setter Property="FontSize" Value="22" />
</Style>

同样,出于非常简单的目的,仅使用简单的标签来实现继承以下目的。在我的窗口 xaml 文件中。根据窗口 xaml,“src:”指向我的类库,它与主题中引用的“local:”是同一个库(但我尝试了两种方法...让两个实例都引用 xmlns:local两者都有,但似乎没有什么区别)。

<src:MyLabel Content="Does Not Respect Style even though derived from MyLabel class" />
<src:MyLabel Content="This one works " Style="{DynamicResource styleMyLabel}" />

<src:MyLabel2 Content="This one doesnt work"/>
<src:MyLabel2 Content="This one works " Style="{DynamicResource styleMyLabel2}" />

我认为如果样式派生自具有相应目标类型样式的类,则不必显式标识该样式。希望它是一些愚蠢的简单的东西,但我无法理解它......


好吧,我偶然发现了似乎可以作为答案的内容,但不明白为什么......如果我尝试更改 MyLabel2 (这是第二个派生实例)的样式

<Style x:Key="styleMyLabel2" TargetType="{x:Type local:MyLabel2}" BasedOn="{StaticResource styleMyLabel}" >
   <Setter Property="FontSize" Value="22" />
</Style>

到(仅删除 x:Key 元素)

<Style TargetType="{x:Type local:MyLabel2}" BasedOn="{StaticResource styleMyLabel}" >
   <Setter Property="FontSize" Value="22" />
</Style>

XAML 可以工作...无需显式关联要使用的“样式”。它直接根据类关联找到它。

<src:MyLabel2 Content="Now Works as expected"/>

现在它可以工作了,有人可以解释为什么额外使用 x:Key 引用会杀死它吗?即:如果您有 x:key,类实例并不暗示它,但如果没有它,直接类会自动找到它。

从我对风格的探索中扩展......

所以,这是我发现的一些额外内容。可以将样式多次定义为相同的目标类型...但是,一个样式可以有一个 x:key 引用,另一个可以有一个 BasedOn 引用。这看起来就像重载具有相同数量但不同数据类型参数的函数。

在我的问题中,一旦将“x:Key”引用添加到样式中,“TargetType”的任何直接类实例都不会自动链接到正确的样式,几乎就像带有“x:key”的样式声明一样" 要求类的任何实例在控件的 xaml 中显式添加样式上下文。那么现在,如何两全其美。我创建了一种以 TargetType 作为基类的第二种样式,但它的 BasedOn 指向 x:key 引用的样式。这样,我就获得了样式的默认自定义,但仍然可以将其分配给基类和派生类,因此控件的所有 3 个版本都可以自动与相应的样式同步,而无需显式引用。

<Style TargetType="Label" x:Key="wpfBaseLabel">
   <Setter Property="FontSize" Value="11" />
</Style>

<Style TargetType="Label" BasedOn="{StaticResource wpfBaseLabel}" />

<Style TargetType="{x:Type local:MyLabel}" BasedOn="{StaticResource wpfBaseLabel}">
   <Setter Property="Foreground" Value="Blue" />
</Style>

因此,现在,在最终的 XAML 中,我可以在有或没有显式样式关联的情况下使用所有 3 个“类”。

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

WPF 类和相应的视觉样式继承 的相关文章

  • 为什么这个 Microsoft.VisualStudio.Imaging.CrispImage 不显示任何内容?

    我正在尝试创建一个非常简单的 WPF 应用程序来实验 Visual Studio 的这个概念图像服务和目录 https msdn microsoft com en us library mt628927 aspx 我不明白为什么我似乎无法在
  • WPF 中的 IWin32Window

    我有一个 excel AddIn 它公开 IWin32Window 作为它的主 UI 我想显示一个使用它作为父窗口的 WPF 窗口 我该如何去做呢 您可以使用窗口互操作助手 http msdn microsoft com en us lib
  • 尝试在 Expression-Blend 4 中打开在 Visual Studio 2010 中创建的 WPF 项目时出现问题

    我在 VS 2010 中创建 WPF 项目 在完成功能性 GUI 的工作后 我想在 Blend 4 中编辑控件模板 但是当我在 Blend 中以 DesignMode 打开项目时 他告诉我 无效的 XAML 在结果窗口中他写道 Window
  • 基于动态资源的样式

    看来这样的事情是不允许的 有什么解决办法吗
  • WPF DataGrid 显示点而不是逗号

    在网上查找并寻找答案后没有结果 我想向您寻求帮助 我有一个包含 2 列的 SQL 数据库表 浮点数据类型 例如 1 2 1 3 1 4 等 绑定到一个DataGrid XAML 代码
  • WPF - 普通 [标签:输入] 控制的最佳实践

    我想知道 这是在 WPF 中获取众所周知的标签输入 或输出 无关紧要 组合的最佳和最快的方法 这是一个简单的任务 只需考虑 对象 ME 的快速输出 名字 克里斯蒂安 年龄 28 心情 好 我知道 我可以使用带有文本块的网格 但说实话 这个
  • 在WPF中如何添加菜单项事件?

    在我的 WPF 应用程序中 我添加一个菜单 然后在其下添加几个菜单项 例如 我的菜单项之一是 Main Item 然后我在 Main Item 下添加subItem1 subItem2和subItem3 我想单击 subItem1 并执行某
  • 继承属性,从 readonly 继承的属性中读写时不会合成 setter

    我在使用属性时发现了一个奇怪的行为 该属性被继承为只读 然后在继承的类中重新声明为读写 In A h interface A NSObject property nonatomic strong readonly NSObject some
  • 将 MouseBindings 添加到数据绑定 WPF ListView 中的项目

    我试图在用户单击 ListView 中的项目时执行 ViewModel 中的命令 当我添加一个ListViewItem在 XAML 中我可以添加一个MouseBinding to its InputBindings
  • 使用抽象类作为模板类型

    我对c 还是很陌生 来自java 我有一个 stl 类型列表Actor When Actor仅包含 真实 方法就没有问题 我现在想将这个类扩展到几个类 并且需要将一些方法更改为抽象的 因为它们不再具有具体的意义 正如我 从文档中 预期的那样
  • 在 Composite WPF (Prism) 中,我应该如何对我的控制器进行单元测试?

    我正在使用一个模块构建一个基本的复合 WPF Shell 我想对我的模块进行单元测试 显然 Composite WPF 以一种易于单元测试的方式模块化我的代码 下面是我想要进行单元测试的代码 它驻留在我的模块的控制器中 请注意标准复合 WP
  • CSS - 让div继承高度

    我正在尝试制作一个带有圆角的盒子 其中 div 的高度和宽度取决于内容 因此它会自动调整 您可以在此处查看示例 http pastehtml com view 1duizyf html http pastehtml com view 1du
  • 使用 XAML 文件作为矢量图像源

    我希望能够使用矢量图形 最好在 XAML 中定义 作为图像控件的源 就像我当前可以使用 PNG 等光栅图像一样 这样我就可以轻松地混合和匹配位图和矢量图像 如下所示
  • WPF 简单绑定到对象属性

    我在 wpf xaml 中绑定时遇到一些问题 有这个简单的文件
  • 捕获多点触摸屏上的双击触摸

    我发布了另一个问题 如何通过监视 TouchDown 事件的触摸之间的时间跨度来 手动 捕获双击 但它有很多问题 有谁知道在多点触摸屏上捕获双击的标准 Microsoft 方式 事件 多谢 Dan 我检查了点击位置和秒表的组合 效果非常完美
  • 如何检索 ComboBox 选定的值作为枚举类型?

    这是我的Enum code public enum EmployeeType Manager Worker 我将初始化ComboBox值 而表单将自身初始化为 combobox1 ItemsSource Enum GetValues typ
  • MVVM 创建 ViewModel

    有人可以向我解释一下如何为 MVVM 模式创建 ViewModel 我试图理解这里的教程 http msdn microsoft com en us magazine dd419663 aspx http msdn microsoft co
  • 过滤项目来源

    通过此代码 我设置了数据网格的 ItemsSource 不过 我有更多的 wpf 控件来过滤数据网格 例如从时间范围过滤数据网格 我可以为此编写一个新查询 但这似乎没有必要 因为数据已经可用 我只需要过滤它 最好的方法是什么 我能得到的任何
  • WPF 3D - 在复杂几何体上映射渐变画笔

    我想问是否有人知道如何在 WPF 3D 中的复杂对象上映射渐变画笔 结果应该类似于 matlab 中的 3D 图像 例如 3D 函数 假设您有一些想要可视化的 3 维数据 并且想要通过颜色区分某些级别的值 给定一个 GradientBrus
  • 尝试了解使用服务打开对话框

    我已经阅读了有关使用 mvvm 模式打开对话框的讨论 我看过几个使用服务的示例 但我不明白所有部分如何组合在一起 我发布这个问题寻求指导 以了解我应该阅读哪些内容 以更好地理解我所缺少的内容 我将在下面发布我所拥有的内容 它确实有效 但从我

随机推荐

  • Android 相机实时滤镜

    相机实时滤镜的最佳方式是什么 我最近使用链接中的 GPUImage 库 https github com Cyber Agent android gpuimagelibrary https github com CyberAgent and
  • Symfony2 和 Twig - 检查资产是否存在

    我有一个使用 twig 模板的 symfony2 项目 我正在显示一些图像 并且希望仅在特定资产存在时才显示图像 我有这个 if asset bundles sciforumversion2 images logos conf img im
  • 在Python中定义多维字典的最佳方法? [复制]

    这个问题在这里已经有答案了 我目前正在使用下面的方法在 python 中定义多维字典 我的问题是 这是定义多维字典的首选方式吗 from collections import defaultdict def site struct retu
  • 如何使用 confluence-kafka-python 获取 Kafka 主题最后一条消息的偏移量?

    我需要使用检索主题的最后 N 条消息confluent kafka python 我一直在读https docs confluence io platform current clients confluence kafka python
  • 从相机应用程序返回时重新创建活动

    此问题仅出现在两款较旧的三星 Galaxy 机型上 但仍然非常容易重现 我有一个简单的应用程序 可以显示通过设备的相机应用程序拍摄的照片 它有一个按钮来启动该应用程序 并在 AsyncTask 中处理结果以将其下采样到 ImageView
  • 如何使用seaborn distplot / histplot / displot绘制百分比

    有没有办法在 distplot 上绘制百分比而不是计数 ax sns FacetGrid telcom hue Churn palette teal crimson size 5 aspect 1 ax ax map sns distplo
  • 如何计算采购量与销售量的差额?

    如何使用 Ms Access 数据库计算一次查询中的采购量和销售量之间的差异 例如 我的数据如下所示 ProductId Type Quantity 1 Purchase 24 1 Sale 1 如何在一个查询中获得 24 1 23 的差值
  • 设置超时 Internet Explorer

    我在 MSIE 中有以下 javascript setTimeout myFunction 1000 param 这似乎适用于除 Internet Explorer 之外的所有浏览器 参数只是没有转发到函数 查看调试器 它是未定义的 par
  • 奇怪的通用继承模式

    在一些研究过程中 我遇到了一种使用我以前从未见过的泛型的继承模式 http thwadi blogspot ca 2013 07 using protobuff net with inheritance html http thwadi b
  • 将 cakephp POST 参数插入 URL

    我有下面的表格 其中包含两个复选框来对某些产品进行排序
  • 什么是焊接,JSR-299?

    我发现了很多显示 Weld 代码示例的教程 但没有介绍性概述 您能否推荐一篇介绍性文章 或回答以下问题 Weld 能做什么 给你带来什么 它与 Java EE 6 有什么关系 如何在 Java EE 6 项目中使用它 如果在 Java EE
  • 使用c++ opengl的贝塞尔曲线

    我使用此代码通过单击一个点来绘制贝塞尔曲线 如果我使用编写的静态公式 它会起作用drawBezier函数 它会形成正确的曲线 但是如果我使用写成的广义公式drawBezierGeneralized 最后一点有问题 我究竟做错了什么 incl
  • 将 Hadoop 中的文件获取到 Web 应用程序中

    我是 Hadoop 新手 现在我正在尝试在 eclipse 中做一个应用程序 我想在其中使用 HDFS 中存在的数据 如果我们想用Java连接数据库 我们有JDBC连接 那么 我需要做什么才能直接连接HDFS呢 在 Hadoop 中 首先
  • SQL Server 2016_无法启动镜像

    将SQL Server 2014升级到SQL Server 2016 都是企业版 后 我无法启动镜像 这在 SQL Server 2014 上正常工作 我恢复后 WITH NORECOVERY 镜像数据库 包含我通常运行的主数据库的完整备份
  • 如何强制 Iframe 在标准父框架下运行怪异

    我们有一个父页面必须在 IE9 标准模式下运行 执行 HTML5 命令 下面我们有一个必须在兼容模式 IE7 8 下运行的 iframe 据我了解 在 IE9 中 iframe 继承了父级的文档类型 那是对的吗 这个问题有什么解决办法吗 不
  • 将附加参数传递给 python 回调对象 (win32com.client.dispatchWithEvents)

    我正在使用 win32com 包与 Windows 应用程序交互 应用程序并不重要 简而言之 我想要实现的是订阅更新的表 我已经成功实现了一个回调 该回调接收表更新时返回的数据 但我现在需要的是对收到的数据采取行动 如果我可以使用附加参数实
  • VHDL - iSIM 输出未初始化,不改变状态

    您好 我是一位 Xilinx 新用户 在如何在测试台中编写激励 模拟方面遇到了麻烦 我的输出 Kd 没有给我任何合理的值 并在移动并始终保持在 1 之前的前几个时钟周期给出 u 不确定我是否写了正确的刺激 但希望有人能帮助我 我的VHDL代
  • 空字符串对于 React Link 来说是有效值吗?

    我正在写一个React js http React 20 E2 80 93 20A 20JavaScript 20library 20for 20building 20user 20interfaces 20 20https reactjs
  • 如何在Python中使用将双反斜杠替换为单反斜杠来替换字节字符串

    我想将 Python 中字节字符串的双反斜杠替换为单反斜杠 例如 有一个字节字符串 word b Z xa6 x97 x86j2 x08q r xca xe6m 我需要这个字节字符串 word b Z xa6 x97 x86j2 x08q
  • WPF 类和相应的视觉样式继承

    我已经看过 但显然在与类和样式相关时无法获得正确的语法 我有具有特定行为的控件 我派生出一些来添加额外的行为 现在 我想要一个与每个版本相对应的样式 在最简单的示例中 我将忽略这些类 因为我知道样式与视觉影响具体相关 而不是与功能影响相关