首页 > 其他分享 >WPF 自定义ComboBox

WPF 自定义ComboBox

时间:2023-06-21 10:55:36浏览次数:39  
标签:控件 Popup 自定义 ComboBox timer JComboBox WPF

需求

ComboBox下拉列表,在光标移出ComboBox后,下拉列表立即收起。

 

利用WPF的  自定义控件 继承于ComboBox开发项目中需要的JComboBox,其代码如下:

namespace FrameWPF
{
    /// <summary>
    /// 按照步骤 1a 或 1b 操作,然后执行步骤 2 以在 XAML 文件中使用此自定义控件。
    ///
    /// 步骤 1a) 在当前项目中存在的 XAML 文件中使用该自定义控件。
    /// 将此 XmlNamespace 特性添加到要使用该特性的标记文件的根
    /// 元素中:
    ///
    ///     xmlns:MyNamespace="clr-namespace:FrameWPF"
    ///
    ///
    /// 步骤 1b) 在其他项目中存在的 XAML 文件中使用该自定义控件。
    /// 将此 XmlNamespace 特性添加到要使用该特性的标记文件的根
    /// 元素中:
    ///
    ///     xmlns:MyNamespace="clr-namespace:FrameWPF;assembly=FrameWPF"
    ///
    /// 您还需要添加一个从 XAML 文件所在的项目到此项目的项目引用,
    /// 并重新生成以避免编译错误:
    ///
    ///     在解决方案资源管理器中右击目标项目,然后依次单击
    ///     “添加引用”->“项目”->[浏览查找并选择此项目]
    ///
    ///
    /// 步骤 2)
    /// 继续操作并在 XAML 文件中使用控件。
    ///
    ///     <MyNamespace:JComboBox/>
    ///
    /// </summary>
    public class JComboBox : ComboBox
    {
        static JComboBox()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(JComboBox), new FrameworkPropertyMetadata(typeof(JComboBox)));
        }
        public JComboBox()
        {
            this.Loaded += JComboBox_Loaded;
        }

        private void JComboBox_Loaded(object sender, RoutedEventArgs e)
        {

            Popup popup = (Popup)this.Template.FindName("PART_Popup", this);
            if (popup != null)//JComboBox刚加载时Popup并未显示,故不能找到
            {
                popup.MouseLeave += Popup_MouseLeave;
                popup.MouseEnter += Popup_MouseEnter;

                timer = new System.Timers.Timer
                {
                    Interval = 1000
                };
                timer.Elapsed += Timer_Elapsed;
                this.DropDownOpened += JComboBox_DropDownOpened;
            }
        }

        private void JComboBox_DropDownOpened(object sender, EventArgs e)
        {
            timer?.Start();
        }

        System.Timers.Timer timer;
        private void Popup_MouseEnter(object sender, MouseEventArgs e)//由于定时器1S后会关闭Popup,若点开Popup 在1S内进入了Popup,则定时器停止。
        {
            timer.Stop();
        }

        private void Timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            timer.Stop();
            Application.Current.Dispatcher.Invoke(() =>
            {
                this.IsDropDownOpen = false;
            });
        }

        private void Popup_MouseLeave(object sender, MouseEventArgs e)
        {
            this.IsDropDownOpen = false;
        }
    }
}

代码中添加了一个定时器,是为了避免若你点开了下拉列表的Popup,但一直停在原处或移到了非Popup的地方,则1S后就关闭Popup。

 

如此可在触摸环境下,点开了combobox的下拉列表,避免了不做选择,就点击其他按钮时无响应的情况(因为你在点击时会先去收起ComboBox的Popup,再次点击才会响应按钮的事件; 非按钮,若是文本框,则需要双击才能选中文本框,然后才能录入文本)。

 

标签:控件,Popup,自定义,ComboBox,timer,JComboBox,WPF
From: https://www.cnblogs.com/chengcanghai/p/17495692.html

相关文章

  • 【Java】使用 validation 完成自定义校验注解
    总括:validation让我们简化了开发过程,可以使用简单的一个注解就实现了很多常见的检验数据的功能,同时支持自定义注解。spring-boot-starter-validation是由SpringBoot整合的一套用于处理 validation的约定化自动配置启动器。Spring系列框架通过简单的安装依赖即可直接使用......
  • 前端Vue自定义列表表格信息展示可用于商品规格参数展示
    前端Vue自定义列表表格信息展示可用于商品规格参数展示 ,下载完整代码请访问uni-app插件市场地址:https://ext.dcloud.net.cn/plugin?id=13131效果图如下:使用方法<!--table-list:表格数组数组里对象可自定义字段 --><cc-defineTable:table-list="tableArr"></cc-defin......
  • 前端Vue自定义顶部搜索框 热门搜索 历史搜索 用于搜索跳转使用
    前端Vue自定义顶部搜索框热门搜索历史搜索用于搜索跳转使用,下载完整代码请访问uni-app插件市场地址:https://ext.dcloud.net.cn/plugin?id=13128效果图如下:自定义顶部搜索框用于搜索跳转使用方法<!--自定义顶部搜索框用于搜索跳转skipUrl:跳转url为绝对路径/pages开......
  • ui设计师界面combobox控件添加鼠标点击信号
    一、概述combobox下拉框控件下拉后会显示预设好的选择内容,可是想要实现显示内容动态可变,点击的时候实时刷新到最新内容,就需要点击信号,但是qt本身没有实现这个点击信号。要实现这个功能本质方法是需要重写combobox的鼠标点击事件,这里介绍如何为ui设计师界面的combobox控件添加......
  • 多路Qt串口通信源码C++语言接口自定义协议帧Qt读写配置文件ini出售: 可变长定长通信接
    多路Qt串口通信源码C++语言接口自定义协议帧Qt读写配置文件ini出售:可变长定长通信接口协议实现Qt多路串口发送接收SerialProtocol.rar工控自定义报文可用于嵌入式,单片机,ARM,DSP等常见的串口通信中,出售在应用实践中编写总结的源代码,实现自定义的串口通信协议,包括报文头部、长度......
  • 自定义可编辑的对话框
    Dialogdialog=newDialog(this);dialog.setContentView(R.layout.your_dialog_file);ButtonyourButton=dialog.findViewById(R.id.yourButton);finalEditTexttext=dialog.findViewById(R.id.yourTextEdit);yourButton.setOnClickListener({publicvo......
  • 5步带你玩转SpringBoot自定义自动配置那些知识点
    目前SpringBoot框架真的深受广大开发者喜爱,毕竟它最大的特点就是:快速构建基于Spring的应用程序的框架,而且它提供了各种默认的功能和配置,可以让开发者快速搭建应用程序的基础结构。但是,当我们需要自定义一些配置时,我们就需要使用自定义自动配置。今天一定让大家深刻体验干货知识点......
  • 从0到1构造自定义限流组件
    一背景在系统高可用设计中,接口限流是一个非常重要环节,一方面是出于对自身服务器资源的保护,另一方面也是对依赖资源的一种保护措施。比如对于Web应用,我限制单机只能处理每秒1000次的请求,超过的部分直接返回错误给客户端。虽然这种做法损害了用户的使用体验,但是它是在极端并发......
  • WinUI ComboBox加载时不能正常显示绑定属性
    搞WINUI时发现下述问题:ComboBox的item1绑定了一个属性,但是程序在加载完成后,页面上并不能正常显示(已经设置了默认选择为ComboBox绑定属性那个item,但是就不正常);而TextBlock绑定相同的属性,是能正常显示的。 具体现象如下,左红色框中为TextBlock,右蓝色框中为ComboBox。 其xam......
  • vue鼠标拖拽自定义指令实现过程和原理分析
    在Vue中,可以使用自定义指令来实现鼠标拖拽的功能。自定义指令允许我们在DOM元素上绑定特定的行为和逻辑。以下是一个实现鼠标拖拽的自定义指令的例子,同时也包含了相应的原理分析:<template><divv-draggable>DragMe!</div></template><script>exportdefault{directives......