C# WPF如何自定义控件ComboBox

news2024/12/25 12:30:32

在WPF开发中,经常遇到需要修改原生ComboBox的控件样式。

对于新手来说,修改控件样式比较麻烦。

修改的最终样式如下:
在这里插入图片描述

你可以利用如下代码模板,修改为你自己想要的样式。

<Style TargetType="{x:Type ComboBox}">
    <Setter Property="Background" Value="White"/>
    <Setter Property="BorderThickness" Value="1"/>
    <Setter Property="ItemContainerStyle">
        <Setter.Value>
            <!--ComBoxItem-->
            <Style TargetType="ComboBoxItem">
                <Setter Property="MinHeight" Value="22"></Setter>
                <Setter Property="Width" Value="auto"></Setter>
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="ComboBoxItem">
                            <Border Name="Back" Background="Transparent"  BorderThickness="0,0,0,0" BorderBrush="#81D779" >
                                <ContentPresenter  VerticalAlignment="Center" HorizontalAlignment="Left" Margin="5,0,0,0"></ContentPresenter>
                            </Border>
                            <ControlTemplate.Triggers>
                                <Trigger Property="IsMouseOver" Value="True">
                                    <Setter TargetName="Back" Property="Background" Value="LightGray"></Setter>
                                </Trigger>
                                <Trigger Property="IsHighlighted" Value="True">
                                    <Setter TargetName="Back" Property="Background" Value="LightGray"></Setter>
                                </Trigger>
                            </ControlTemplate.Triggers>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </Setter.Value>
    </Setter>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ComboBox}">
                <Border BorderThickness="1" BorderBrush="White" CornerRadius="0" Height="30" Background="{TemplateBinding Background}" >
                    <Grid >
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="3*"/>
                            <ColumnDefinition Width="30"/>
                        </Grid.ColumnDefinitions>
                        
                        <!-- left area-->
                        <Grid Grid.Column="0" x:Name="grid">
                            <ToggleButton
                                    Width="{Binding ElementName=grid,Path=ActualWidth}"
                                    Height="{Binding ElementName=grid, Path=ActualHeight}"
                                    Content="{TemplateBinding Text}" VerticalAlignment="Center"
                                    HorizontalAlignment="Left" Margin="5,0,0,0"
                                    BorderThickness="0"
                                    Foreground="{TemplateBinding Foreground}"
                                    Background="{TemplateBinding Background}"
                                    IsChecked="{Binding Path=IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}" ClickMode="Press"
                                    >
                                <ToggleButton.Style >
                                    <Style TargetType="ToggleButton">
                                        <Setter Property="Background" Value="White"/>
                                        <Setter Property="Template">
                                            <Setter.Value>
                                                <ControlTemplate TargetType="ToggleButton">
                                                    <Border   Background="{TemplateBinding Background}" BorderThickness="0"  >
                                                        <TextBlock Foreground="{TemplateBinding Foreground}" Text="{TemplateBinding Content}" Margin="4 0 0 0"  HorizontalAlignment="Left" VerticalAlignment="Center"/>
                                                    </Border>
                                                </ControlTemplate>
                                            </Setter.Value>
                                        </Setter>
                                        <Style.Triggers>
                                            <Trigger Property="IsMouseOver" Value="True">
                                                <Setter Property="Background" Value="White"/>
                                            </Trigger>
                                            <Trigger Property="IsMouseOver" Value="False">
                                                <Setter Property="Background" Value="White"/>
                                            </Trigger>
                                        </Style.Triggers>
                                    </Style>
                                </ToggleButton.Style>
                            </ToggleButton>
                        </Grid>

                        <!-- right Arrow area-->
                        <Grid Grid.Column="1" >
                            <ToggleButton IsChecked="{Binding Path=IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}"
                                  Foreground="{TemplateBinding Foreground}"
                                  ClickMode="Press">
                                <ToggleButton.Style>
                                    <Style TargetType="ToggleButton">
                                        <Setter Property="Background" Value="Transparent"/>
                                        <Setter Property="Template">
                                            <Setter.Value>
                                                <ControlTemplate TargetType="ToggleButton">
                                                    <Border Background="{TemplateBinding Background}" BorderThickness="{TemplateBinding BorderThickness}">
                                                        <Grid>
                                                            <Path x:Name="Arrow" Fill="{TemplateBinding Foreground}" HorizontalAlignment="Center" VerticalAlignment="Center" Data="M 0 0 L 4 4 L 8 0 Z">
                                                                <Path.RenderTransform>
                                                                    <RotateTransform Angle="0" CenterX="4" CenterY="2"/>
                                                                </Path.RenderTransform>
                                                            </Path>
                                                        </Grid>
                                                    </Border>
                                                    <ControlTemplate.Triggers>
                                                        <Trigger Property="IsChecked" Value="True">
                                                            <Setter TargetName="Arrow" Property="RenderTransform">
                                                                <Setter.Value>
                                                                    <RotateTransform Angle="180" CenterX="4" CenterY="2"/>
                                                                </Setter.Value>
                                                            </Setter>
                                                        </Trigger>
                                                        <Trigger Property="IsChecked" Value="False">
                                                            <Setter TargetName="Arrow" Property="RenderTransform">
                                                                <Setter.Value>
                                                                    <RotateTransform Angle="0" CenterX="4" CenterY="2"/>
                                                                </Setter.Value>
                                                            </Setter>
                                                        </Trigger>
                                                    </ControlTemplate.Triggers>
                                                </ControlTemplate>
                                            </Setter.Value>
                                        </Setter>
                                    </Style>
                                </ToggleButton.Style>
                            </ToggleButton>
                        </Grid>
                        <Popup IsOpen="{TemplateBinding IsDropDownOpen}" Placement="Bottom" x:Name="Popup" Focusable="False" AllowsTransparency="True" PopupAnimation="Slide">
                            <Border CornerRadius="1" MaxHeight="{TemplateBinding MaxDropDownHeight}" MinWidth="{TemplateBinding ActualWidth}" x:Name="DropDown" SnapsToDevicePixels="True">
                                <Border.Effect>
                                    <DropShadowEffect Color="Black" BlurRadius="2" ShadowDepth="0" Opacity="0.5"/>
                                </Border.Effect>
                                <ScrollViewer Margin="4,6,4,6" Style="{DynamicResource ScrollViewerStyle}" MaxHeight="{TemplateBinding MaxDropDownHeight}" SnapsToDevicePixels="True" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto" CanContentScroll="True">
                                    <!-- StackPanel 用于显示子级,方法是将 IsItemsHost 设置为 True -->
                                    <StackPanel IsItemsHost="True" KeyboardNavigation.DirectionalNavigation="Contained" Background="White"/>
                                </ScrollViewer>
                            </Border>
                        </Popup>
                    </Grid>


                    <Border.Effect>
                        <DropShadowEffect ShadowDepth="-1" Opacity="0.3" Color="#FF969696" BlurRadius="5"/>
                    </Border.Effect>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>


</Style>


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1482060.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CSP-202112-3-登机牌条码

CSP-202112-3-登机牌条码 解题思路 一、.处理大小写和数字 初始化变量&#xff1a;flag: 用来标识当前处理的字符类型&#xff0c;0代表大写字母&#xff0c;1代表小写字母&#xff0c;2代表数字。 大小写字母和数字的处理&#xff1a; 小写字母(a < it && it &l…

新一代湖仓集存储,多模型统一架构,高效挖掘数据价值

星环科技TDH一直致力于给用户带来高性能、高可靠的一站式大数据基础平台&#xff0c;满足对海量数据的存储和复杂业务的处理需求。 同时在易用性方面持续深耕&#xff0c;降低用户开发和运维成本&#xff0c;让数据处理平民化&#xff0c;助力用户以更便捷、高效的方式去挖掘数…

基带信号处理设计原理图:2-基于6U VPX的双TMS320C6678+Xilinx FPGA K7 XC7K420T的图像信号处理板

基于6U VPX的双TMS320C6678Xilinx FPGA K7 XC7K420T的图像信号处理板 综合图像处理硬件平台包括图像信号处理板2块&#xff0c;视频处理板1块&#xff0c;主控板1块&#xff0c;电源板1块&#xff0c;VPX背板1块。 一、板卡概述 图像信号处理板包括2片TI 多核DSP处理…

anaconda简介以及安装(Windows)

介绍 Anaconda是一个开源的Python发行版本&#xff0c;它是一个打包的集合&#xff0c;里面预装了conda、Python、众多packages、科学计算工具等。Anaconda的目的是方便使用Python进行数据科学研究&#xff0c;它涵盖了数据科学领域常见的Python库&#xff0c;并且自带了专门用…

Linux之gcc和makefile的使用详细解析

个人主页&#xff1a;点我进入主页 专栏分类&#xff1a;C语言初阶 C语言进阶 数据结构初阶 Linux C初阶 算法 欢迎大家点赞&#xff0c;评论&#xff0c;收藏。 一起努力&#xff0c;一起奔赴大厂 目录 一.gcc/g安装 二.gcc运行代码 三.gcc是如何完成的 3.1预处…

matlab图像仿射变换

在Matlab中进行图像的仿射变换通常使用imwarp函数。下面是一个简单的示例代码&#xff0c;以及对应的说明&#xff1a; % 读取图像 image imread(lena.png);% 设置仿射变换矩阵 theta 30; % 旋转角度 scale_factor 1.5; % 缩放因子 shear_factor 0.5; % 剪切因子% 构造仿射…

Ps:海绵工具

海绵工具 Sponge Tool可用于调整图像中特定区域的饱和度&#xff0c;常用于增加或减少颜色的饱和度。 快捷键&#xff1a;O 在特别的灰度图像上&#xff0c;则可用于调整对比度&#xff0c;这可以开发出更多的创意技巧。 ◆ ◆ ◆ 常用操作方法与技巧 1、海绵工具主要用于调整…

二百二十五、海豚调度器——用DolphinScheduler调度执行Flume数据采集任务

一、目的 数仓的数据源是Kafka&#xff0c;因此离线数仓需要用Flume采集Kafka中的数据到HDFS中 在实际项目中&#xff0c;不可能一直在Xshell中启动Flume任务&#xff0c;一是项目的Flume任务很多&#xff0c;二是一旦Xshell页面关闭Flume任务就会停止&#xff0c;这样非常不…

【数据结构与算法】动态规划法解题20240302

这里写目录标题 一、198. 打家劫舍1、动态规划五部曲 二、213. 打家劫舍 II 一、198. 打家劫舍 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间…

iOS消息发送流程

Objc的方法调用基于消息发送机制。即Objc中的方法调用&#xff0c;在底层实际都是通过调用objc_msgSend方法向对象消息发送消息来实现的。在iOS中&#xff0c; 实例对象的方法主要存储在类的方法列表中&#xff0c;类方法则是主要存储在原类中。 向对象发送消息&#xff0c;核心…

vscode 引入外部依赖包

背景 我要在vscode中写一些antlr代码生成的cpp代码&#xff0c;但是在引入头文件#include "antlr4-runtime.h"的时候&#xff0c;出现报错&#xff0c;显示没有这个头文件&#xff0c;显然这是我们没有导入相关的包&#xff0c;因此我首先尝试了将antlr4的依赖源码在…

超链接和导航:网页互动的艺术

引言 在上一篇文章中&#xff0c;我们探索了HTML中多媒体的交互体验&#xff0c;本次我们将学习如何通过超链接和导航栏提升网页的用户体验&#xff0c;让用户在网页访问时更高效&#xff1b; 一、介绍 在这个信息爆炸的时代&#xff0c;如何让用户在第一时间找到他们需要的信…

相机格式化了还能恢复照片吗?内存卡数据恢复方法

相机已成为我们记录生活、工作和学习的重要工具。然而当相机意外格式化后&#xff0c;许多珍贵的照片可能会瞬间消失&#xff0c;这无疑给我们的生活和工作带来不小的困扰。那么相机格式化后&#xff0c;我们是否还有机会找回那些丢失的照片呢&#xff1f; 首先我们需要了解相机…

CSS的弹性布局

CSS 的弹性布局 前言 前端中为了实现页面的布局效果&#xff0c;采用的一个技术手段&#xff0c;它在前端开发的技术场景是非常广泛的 实现上述区域的页面相关的布局效果&#xff0c;就可以使用弹性布局来完成 弹性布局(flex布局) flex 是 flexible box 的缩写&#xff0c;…

ChromeDriver全版本下载教程

确定自己的Chrome版本 step1. 打开Chrome浏览器右上角的三个点&#xff0c;再点击设置 step2. 在设置中点击“关于Chrome”&#xff0c;圈起来的红框即为当前Chrome版本&#xff0c;我的版本就是121.0.6167.185 在json中查找自己对应ChromeDriver版本下载链接 一般教程会让你…

3dmax corona渲染器和vray渲染器哪个好?

Corona和Vray这两个渲染器都很不错&#xff0c;每个都有自己的优点和适用的情况&#xff0c;所以很难说哪个更好。 下面我简单给你对比一下&#xff1a; 1、操作界面&#xff1a;Vray的界面比较多&#xff0c;参数设置也复杂一点&#xff0c;初学者可能会觉得有点难上手。但C…

凌特杯,第二届,数字音频传输。simulink matlab

终于比赛进入了尾声&#xff0c;最为指导老师也是非常的激动。接下来进入了论文写作阶段和视频拍摄阶段。 第二届凌特杯规定的硬件是ADI的Pluto&#xff0c;成本在2k以内&#xff0c;能支持MATLAB&#xff0c;它能够流畅的实时播放接收到的音乐数据&#xff0c;并把数据保存成…

解决Unable to load class ‘org.gradle.api.attributes.VerificationType‘

在使用AdnroidStudio开发过程中难免会遇到Unable to load class org.gradle.api.attributes.VerificationType报错&#xff0c;可以尝试清理缓存重启解决 打开 File-》Invalidate Caches... 重启AndroidStudio后&#xff0c;重新加载即可&#xff0c;但也不是百分百解决。

网络安全学习笔记1

1.了解kali及安装 vmware安装&#xff0c;用户名密码均为kali 2.metasploit是什么 3.metasploit攻击windows系统 在kali中打来终端 数据msfconsole 进入metasploit的控制终端界面 msf的使用法则&#xff1a; 1.使用模块 2.配置模块必选项 3.运行模块 三步操作、实现对…

机器学习高手之路:发现TensorFlow学习网站的无限可能!

介绍&#xff1a;TensorFlow是一个由Google团队开发的端到端开源机器学习平台&#xff0c;专为数值计算和机器学习而设计。以下是对TensorFlow的详细介绍&#xff1a; 开发背景与历史&#xff1a;TensorFlow起源于谷歌的神经网络算法库DistBelief。它被设计成一个灵活的深度学习…