如何在 WPF 中扩展样式

2023-12-13

我将默认按钮设置为如下所示:

<SolidColorBrush x:Key="Button.Static.Background" Color="#FFDDDDDD"/>
<SolidColorBrush x:Key="Button.Static.Border" Color="#FF707070"/>
<SolidColorBrush x:Key="Button.MouseOver.Background" Color="#FFBEE6FD"/>
<SolidColorBrush x:Key="Button.MouseOver.Border" Color="#FF3C7FB1"/>
<SolidColorBrush x:Key="Button.Pressed.Background" Color="#FFC4E5F6"/>
<SolidColorBrush x:Key="Button.Pressed.Border" Color="#FF2C628B"/>
<SolidColorBrush x:Key="Button.Disabled.Background" Color="#FFF4F4F4"/>
<SolidColorBrush x:Key="Button.Disabled.Border" Color="#FFADB2B5"/>
<SolidColorBrush x:Key="Button.Disabled.Foreground" Color="#FF838383"/>

<Style TargetType="{x:Type Button}">
    <Setter Property="Background" Value="Transparent"/>
    <Setter Property="BorderThickness" Value="0"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Button}">
                <Border x:Name="border" 
                        BorderBrush="{TemplateBinding BorderBrush}" 
                        BorderThickness="{TemplateBinding BorderThickness}" 
                        Background="{TemplateBinding Background}" 
                        SnapsToDevicePixels="true"
                        CornerRadius="0">
                    <ContentPresenter x:Name="contentPresenter" Focusable="False" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsDefaulted" Value="true">
                        <Setter Property="BorderBrush" TargetName="border" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
                    </Trigger>
                    <Trigger Property="IsMouseOver" Value="true">
                        <Setter Property="Background" TargetName="border" Value="{StaticResource Button.MouseOver.Background}"/>
                        <Setter Property="BorderBrush" TargetName="border" Value="{StaticResource Button.MouseOver.Border}"/>
                    </Trigger>
                    <Trigger Property="IsPressed" Value="true">
                        <Setter Property="Background" TargetName="border" Value="{StaticResource Button.Pressed.Background}"/>
                        <Setter Property="BorderBrush" TargetName="border" Value="{StaticResource Button.Pressed.Border}"/>
                    </Trigger>
                    <Trigger Property="IsEnabled" Value="false">
                        <Setter Property="Background" TargetName="border" Value="{StaticResource Button.Disabled.Background}"/>
                        <Setter Property="BorderBrush" TargetName="border" Value="{StaticResource Button.Disabled.Border}"/>
                        <Setter Property="TextElement.Foreground" TargetName="contentPresenter" Value="{StaticResource Button.Disabled.Foreground}"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

我希望登录按钮从默认按钮扩展,仅更改边框中的“CornerRadius”属性,这样我就可以使其变圆,而无需制作其他样式/模板或使用 C# 代码。我想这样做或类似的事情:

 <Style x:Key="loginButton" TargetType="{x:Type Button}" BasedOn="{StaticResource {x:Type Button}}">
    <Setter Property="CornerdRadius" Value="10"/>
 </Style>

为您的样式命名,然后根据它创建无键样式。

<Style x:Key="BaseButtonStyle" TargetType="{x:Type Button}">
     <Setter ... />
</Style>

<Style TargetType="{x:Type Button}" BasedOn="{StaticResource BaseButtonStyle}"/>

然后根据您的基本样式为连接按钮创建第二个样式。

<Style x:Key="LoginButtonStyle" TargetType="{x:Type Button}" BasedOn="{StaticResource BaseButtonStyle}">
    <Setter ... />
</Style>

edit :

WPF 按钮中没有“CornerRadius”属性。您必须创建一个继承 Button 的子类并添加 CornerRadius 依赖属性。只有这样你才能按照你想要的方式继承你的风格,并且只改变一个setter。

不幸的是,如果您不想子类化 Button,则必须使用另一个模板执行第二种样式并重写所有触发器。

另一种选择是使用现有属性(如 BorderThickness、Padding 或 Margin),并将其与 ControlTemplate 中的 TemplateBinding 一起使用。但这是一种“黑客”,因为属性的名称不等于它的功能。

edit 2 :

正如 ASh 所建议的,您还可以使用附加的依赖属性来解决您的问题。https://stackoverflow.com/a/40663219/1506454

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

如何在 WPF 中扩展样式 的相关文章

  • 当 DataTable 为空时,DataGrid 显示空行

    我有一个DataGrid dg1 绑定到DataTable 数据集 表 代码运行良好并且DataGrid正在显示数据DataTable正确 但是 如果我Clear the DataTable the DataGrid也很清楚 但留下一个空行
  • 如何更改每个 DataGrid 行详细信息的行详细信息的 DataTemplate 中的 TextBlock 的文本?

    我有 Datagrid 通过鼠标在每一行中单击显示数据网格行详细信息 这是代码 Microsoft Windows Controls DataGridRow row Microsoft Windows Controls DataGridRo
  • 何时使用 C++ 私有继承而不是组合?

    你能给我一个具体的例子吗 什么时候使用私有继承优于组合 就我个人而言 我将使用组合而不是私有继承 但在某些情况下 使用私有继承可能是特定问题的最佳解决方案 正在阅读C faq http www parashift com c faq lit
  • WPF DataGrid 排序后滚动到顶部

    我有一个使用数据网格的 Net 4 0 WPF 应用程序 目前 按列排序后 网格的滚动位置保持在排序前的位置 对于此应用程序 我需要在任何排序后滚动到网格顶部 我尝试过像这样处理排序事件 Private Sub myDataGrid Sor
  • ListView:在资源字典中定义ItemsPanelTemplate

    我有一个 ListView 其布局看起来像 Windows 资源管理器视图 图标 一些详细信息 绑定到 ViewModel 中某处的列表 我的目标是能够随时在资源管理器视图或经典视图之间切换 我可以定义一个ItemsPanelTemplat
  • C#/.NET 3.5:转换扩展通用列表的对象

    我通过带有返回接口类型的方法的外观公开 API 并且在 C NET 3 5 中遇到了通用列表和继承的问题 我有两个接口 IMyList 实现 IList IMyItem 和三个类 MyList 实现 IMyList 扩展 List MyOt
  • WPF 3D - 在复杂几何体上映射渐变画笔

    我想问是否有人知道如何在 WPF 3D 中的复杂对象上映射渐变画笔 结果应该类似于 matlab 中的 3D 图像 例如 3D 函数 假设您有一些想要可视化的 3 维数据 并且想要通过颜色区分某些级别的值 给定一个 GradientBrus
  • 获取程序集中所有资源的列表

    我有一个文件夹Resources并想要获得一份包含所有内容的列表paths 如果我将它们设置为embedded resource 我可以通过 var resources Assembly GetExecutingAssembly GetMa
  • 从字节数组创建 BitmapImage

    我正在创建一个包含任意值的字节数组 并希望将其转换为 BitmapImage bi new BitmapImage using MemoryStream stream new MemoryStream data try bi BeginIn
  • GridSplitter 从右侧调整大小 - 奇怪的行为

    使用 Kaxaml 从左侧调整大小可以按预期工作
  • 什么是WPF浏览器应用程序类型项目?

    什么时候应该使用 WPF 浏览器应用程序 该项目类型有什么用处 开发人员什么时候应该使用这个 WPF 浏览器应用程序是在浏览器中作为 XBAP Xaml 浏览器应用程序 运行的应用程序 您可以找到有关 XBAP 的用途和原因的更多信息her
  • 用于导入基本模板类的所有名称的 C++ 宏[重复]

    这个问题在这里已经有答案了 当从模板基类派生类时 必须使用以下语法this gt member or using Base member访问基类的成员 如果基类是通用模板参数并且确定某些成员存在 也会发生同样的情况 是否可以编写一个宏来 导
  • 通过setter设置继承的属性

    我有这个代码 Vehicle object constructor function Vehicle this wheels 4 Adding setWheels setter function to set wheels property
  • 在表格中可视化 2D 数据

    我需要一些帮助并且需要指出正确的方向 我正在创建一个应显示二维数据的 WPF 应用程序 它应该显示如下 y x 1 2 3 4 5 1 1 2 3 4 5 2 2 4 6 8 10 3 3 6 9 12 15 4 4 8 12 16 20
  • C++ 是否要求从派生类初始化基类成员?

    class Base public int a Base a 0 virtual Base class Derived public Base public int b Derived b 0 Base pBase static cast
  • 将 ARGB 拆分为字节值

    我有一个 ARGB 值存储为 int 类型 它是通过调用 ToArgb 来存储的 我现在想要来自 int 值的各个颜色通道的字节值 例如 int mycolor 16744448 byte r g b a GetBytesFromColor
  • 私人继承

    我不完全理解这一点 class Base public Base cout lt lt Base lt lt endl virtual void call cout lt lt Base call lt lt endl class Deri
  • Silverlight 4 中使用显式样式进行运行时主题切换

    有人要求我们向我们的应用程序添加动态主题切换 但我在弄清楚如何执行此操作时遇到了问题 目前的情况是这样的 我们的应用程序有一个具有显式 非隐式 样式的合并资源字典 我们应用程序中的视图通过以下方式引用这些样式StaticResource标记
  • 如何在 WPF RichTextBox 中跟踪 TextPointer?

    我正在尝试了解 WPF RichTextBox 中的 TextPointer 类 我希望能够跟踪它们 以便我可以将信息与文本中的区域相关联 我目前正在使用一个非常简单的示例来尝试弄清楚发生了什么 在 PreviewKeyDown 事件中 我
  • 更改窗口的内容 (WPF)

    我创建了一个简单的 WPF 应用程序 它有两个 Windows 用户在第一个窗口中填写一些信息 然后单击 确定 这会将他们带到第二个窗口 这工作正常 但我试图将两个窗口合并到一个窗口中 这样只是内容发生了变化 我设法找到了这个更改窗口内容时

随机推荐

  • Git:“git 克隆”到现有文件夹的最佳实践是什么?

    我有该项目的工作副本 没有任何源代码控制元数据 现在 我想在该文件夹中执行相当于 git clone 的操作 并保留本地更改 git clone 不允许我克隆到现有文件夹中 这里的最佳实践是什么 这可以通过克隆到新目录 然后移动 git目录
  • 更改会话中的 tempdir() (更新 R_TempDir)

    我正在寻找一种方法来改变tempdir R 会话开始后的位置 我认为需要更新C级全局变量R TempDir 从 R 内部完成此操作的好方法是什么 更新 西蒙 厄本内克斯unix 工具包有一个函数可以完成这个任务 代码如下 以供将来参考 se
  • Spring Boot 提供被安全阻止的静态内容

    我启动了 Spring Boot Angular 应用程序 现在我想将整个应用程序部署为 jar 所以我创建了 Maven 配置 其中构建了 Angular 应用程序 然后将其复制到 target classes resources 但每个
  • 最小成本的动态规划问题[关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我有一个手机信号塔问题 有n个城镇 我们想在一些城镇建造手机信号塔 每个蜂窝塔都可以覆盖自己及其邻居 每个城镇都有建造手机信号塔的费用 我们想找出建造覆盖所有城镇的手机信号塔的最低成
  • 如何在 Hyperledger Composer 查询中显示交易输入数据

    我正在尝试构建一个历史查询 它允许我查看交易 及其原始输入 我正在尝试基于这个问题的想法https github com hyperledger composer issues 1850 但这已在 Composer Playground 中
  • A a() 是什么意思? [复制]

    这个问题在这里已经有答案了 考虑这段代码 include
  • 角度材质对话框显示两次

    我使用 Leaflet 绘制地图 并尝试使用 Angular Material 来显示一些模态 但遇到了问题 模态 ModalComponent 应该在用户单击地图时打开 我为此添加了单击事件 请参阅MapComponent 在这个事件中
  • 将py文件转换为exe,找不到现有的PyQt5插件目录

    我对 phyton 很陌生 刚刚完成了我的第一个应用程序 现在 我正在尝试将我的 py 文件编译为似乎不起作用的 exe 购买 我到处寻找解决我问题的方法 但似乎找不到 当我运行此命令时 pyinstaller gui py 显示此错误 4
  • MPMediaItem - MPMediaItemArtwork 的 NSCoding 问题

    因此 MPMediaItem 符合 NSCoding 但它包含一个指向 MPMediaItemArtwork 的指针 该指针不符合 NSCoding 因此 如果我尝试存档 MPMediaItem 如果该项目中有一些艺术品 则它将无法取消存档
  • 如何在C#中调用C++ DLL

    我用 dev C 编写了一个 DLL 该DLL的名称是 DllMain dll 它包含两个函数 HelloWorld and ShowMe 头文件如下所示 DLLIMPORT void HelloWorld DLLIMPORT void S
  • Javascript 对象打印为对象对象

    我对节点和 mongo db 都非常陌生 我正在创建从节点到 Mongo 的连接并尝试 CRUD 操作 我的操作在 Operations js 中定义 并且我从索引调用函数 我面临的问题是当我打印回调参数时 coll find toarra
  • NumPy 数学函数比 Python 更快吗?

    我有一个由基本数学函数 abs cosh sinh exp 组合定义的函数 我想知道使用它是否会产生影响 速度 例如 numpy abs 代替abs 以下是计时结果 lebigot weinberg python m timeit abs
  • pdfmake 中未显示页脚

    我有以下代码 可在单击 pdf 时生成数据表 pdf 在自定义功能中 我有一个页脚代码 应该显示页码 document ready function SHOW EXSITING LINE ITEMS var id Model Order I
  • 如何将 Visual Studio 项目作为安装程序发布/部署

    我刚刚为一家公司开发了一个系统 它将用于 50 多台 PC 剩下的唯一问题是安装过程 我认为手动复制项目的整个文件夹效率不高 例如在 Documents 文件夹中 并在每台 PC 上创建 exe 文件的桌面快捷方式 如果可以的话我想压缩一下
  • 使用 C++20 中派生的“使用”CRTP

    我正在尝试了解 CRTP 和 C 20 基本上 我想要拥有可以访问派生类型的静态继承typedefs and using template
  • 有什么方法可以“提交” Redux 中的状态以释放内存吗?

    我正在尝试实时多人游戏我在服务器和客户端上都使用 Redux 来存储应用程序的状态 但是 由于我的游戏是实时的 因此发送到商店的操作量明显高于通常的应用程序 我怀疑这就是 Redux 使用大量内存的原因 据我了解 Redux 将所有分派到内
  • Referrer 策略隐藏自签名证书的 Referrer

    我似乎无法通过自签名证书向开发服务器发出第 3 方 XHR 请求的引荐来源网址 在遵守 Chrome 使用 SAN 而不是 CN 并注册我的自签名本地主机证书后 我在开发工具安全面板中获得了此请求的绿点 但我还得到了以下信息 This re
  • 为什么这个TStreamAdapter没有被释放?

    比较这两个片段 d as IPersistStream Save TStreamAdapter Create TFileStream Create test bin fmCreate soOwned true d as IPersistSt
  • DOMDocument->saveHTML() 将 转换为空格

    在我的代码中 我有 document DomDocument gt loadHTML someHTML xPath new DOMXPath document do some xpath query and processing resul
  • 如何在 WPF 中扩展样式

    我将默认按钮设置为如下所示