iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >WPF中下拉框可作选择项作为只读文本框怎么使用
  • 578
分享到

WPF中下拉框可作选择项作为只读文本框怎么使用

2023-07-05 02:07:40 578人浏览 独家记忆
摘要

本篇内容介绍了“WPF中下拉框可作选择项作为只读文本框怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、需求当前在开发的系统需要一个

本篇内容介绍了“WPF中下拉框可作选择项作为只读文本框怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

    1、需求

    当前在开发的系统需要一个这样的控件。

    (1)可以选择已有的选择项,类似于ComboBox选择;

    (2)可以通过其他按钮点击,选择一个文件,选择后,把文件路径显示到控件上,并且处于只读状态,行为和只读状态下的TextBox保持一致。

    更直观些,就是实现类似ArcMap中Toolbox中的数据集选择下拉框,如下图所示。

    WPF中下拉框可作选择项作为只读文本框怎么使用

    该控件可以通过下拉的方式,选择左侧的图层数据,又可以通过点击右侧的打开文件按钮,弹出打开文件对话框,选择要设置的数据文件。该控件还可以通过键盘输入,但我们的需求是禁止输入,只能选择和通过打开文件对话框设置。

    2、现有的ComboBox

    我计划在WPF中的ComboBox控件的基础上进行开发,首先看通过简单的属性设置是否能够满足要求。

    (1)不设置任何参数

    在不设置任何参数的情况下,效果如下图所示。

    WPF中下拉框可作选择项作为只读文本框怎么使用

    可以显示底图上加载的数据,但点击【Select】按钮,通过设置ComboBox.Text属性,数据显示不出来,这种效果离我们想要的还差十万八千里。

    (2)设置ComboBox.IsEditable=true

    下面我们尝试通过设置ComboBox的属性看能不能达到我们想要的效果。首先把ComboBox.IsEditable属性设置为true,然后测试下Text属性设置后是否有效果了。

    WPF中下拉框可作选择项作为只读文本框怎么使用

    目前可以把选择的文件路径设置到ComboBox.Text了,并且可以正常显示,但鼠标点上去,文本框的内容可以修改,这不是我们想要的。于是发现ComboBox有个IsReadOnly属性,把该属性设置为true尝试一下试试。

    WPF中下拉框可作选择项作为只读文本框怎么使用

    目前下拉框中的内容不能修改了,但实际操作的时候会发现有些别扭。当鼠标点击下拉框,该控件得到焦点的时候,里面的文字默认处于全选状态,此时想拖动鼠标,把文字拖动到尾部是操作不了的,只能再次点击下拉框中的内容,才可以和普通文本框的操作一样通过鼠标拖动视图。

    经过各种尝试,发现当ComboBox控件GotFocus的时候,里面的文字会默认处于全选状态,这个我们需要解决一下。

    3、使用VisualTreeHelper单独处理TextBox

    在网上查询,发现ComboBox在IsEditable=true的状态下,是有很多个控件组合而成的。如下图所示。

    WPF中下拉框可作选择项作为只读文本框怎么使用

    我们可以调用VisualTreeHelper,获取这个TextBox,不过需要在Load后,再调用,不然这些控件是获取不到的。

    this.Loaded += (x, y) =>{    var myMainGrid = VisualTreeHelper.GetChild(this, 0);    var myTextBox = VisualTreeHelper.GetChild(myMainGrid, 4) as TextBox;    myTextBox.IsReadOnly = true;    myTextBox.IsReadOnlyCaretVisible = true;};

    获取TextBox后,我们需要解决ComboBox激活后,文字全选的问题。代码如下。

    myTextBox.GotFocus += (m, n) =>{    myTextBox.SelectionOpacity = 0;    this._IsNeedClearSelection = true;};

    该代码的的作用是当TextBox得到焦点后,立刻把TextBox中文字选中的背景颜色的透明度设置为0,这样操作者就感觉不出来文字被选中了。

    鼠标左键弹起前,需要清空选中文字,并把光标放到鼠标点击处,并还原文本选中的颜色,代码如下。

    myTextBox.PreviewMouseLeftButtonUp += (m, n) =>{    if (this._IsNeedClearSelection == false)    {        return;    }    var myPosition = n.GetPosition(myTextBox);    int mySelectionStart = myTextBox.GetCharacterIndexFromPoint(myPosition, true);    myTextBox.Select(mySelectionStart, 0);    this._IsNeedClearSelection = false;    myTextBox.SelectionOpacity = 0.4;};

    此时,基本上ComboBox能够满足我们的需求了,效果如下图所示。

    WPF中下拉框可作选择项作为只读文本框怎么使用

    但还有一个问题,就是在ComboBox在IsEditable=true的状态下,鼠标移动到可选项上的时候,选择项不高亮了。为了解决这个问题,尝试了很多方法,都不行,准备放弃,就这样了。

    因为系统使用了DEV for WPF UI库,忽然想到了WPF DEV中的ComboBoxEdit,之前测试过,通过设置属性,满足不了需求。但没有使用VisualTreeHelper深入的去测试,那就再尝试下看看。

    4、使用WPF DEV中的ComboBoxEdit

    测试的时候,ComboBoxEdit在任何属性都不设置的情况下,除了文字可以编辑,其他的都可以满足要求。于是我设置IsReadOnly=True,但这个时候,下拉框中的可选择项都处于不可用状态,也不能选择,所以IsReadOnly属性不能设置成True。尝试了一下有可能性的其他属性,例如EditMode等,都不能满足需求。

    但在测试ComboBox的时候,知道了WPF的可视化树这个概念,可以通过VisualTreeHelper获取组成控件的子控件。于是加载后,在Load事件中,我们查看下ComboBoxEdit组织树,如下图所示。

    WPF中下拉框可作选择项作为只读文本框怎么使用

    我看到了里面有个TextBox控件,这个就是显示文本的控件了,感觉是不是获取到这个TextBox后,把该TextBox设置成只读是不是问题就完美解决了?

    这个树比较深,我就找了一段根据类型获取元素的代码,如下图所示。

    public static List<T> FindVisualChild<T>(DependencyObject pDependencyObject) where T : DependencyObject{    List<T> myTList = new List<T> { };    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(pDependencyObject); i++)    {        DependencyObject myChild = VisualTreeHelper.GetChild(pDependencyObject, i);        if (myChild != null && myChild is T myT)        {            myTList.Add(myT);            List<T> myChildOfChildren = FindVisualChild<T>(myChild);            if (myChildOfChildren != null)            {                myTList.AddRange(myChildOfChildren);            }        }        else        {            List<T> myChildOfChildren = FindVisualChild<T>(myChild);            if (myChildOfChildren != null)            {                myTList.AddRange(myChildOfChildren);            }        }    }    return myTList;}

    获取TextBox和设置其属性的代码如下。

    public class DatasetComboBoxExUI : ComboBoxEdit{    public DatasetComboBoxExUI()    {        this.Loaded += (x, y) =>        {            List<TextBox> myTextBoxList = VisualTreeExHelper.FindVisualChild<TextBox>(this);            if (myTextBoxList.Count == 0)            {                return;            }            var myTextBox = myTextBoxList[0];            myTextBox.IsReadOnly = true;            myTextBox.IsReadOnlyCaretVisible = true;        };    }}

    启动测试,效果非常完美,正是我们需要的,界面如下图所示。

    WPF中下拉框可作选择项作为只读文本框怎么使用

    “WPF中下拉框可作选择项作为只读文本框怎么使用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

    --结束END--

    本文标题: WPF中下拉框可作选择项作为只读文本框怎么使用

    本文链接: https://www.lsjlt.com/news/349166.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • WPF中下拉框可作选择项作为只读文本框怎么使用
      本篇内容介绍了“WPF中下拉框可作选择项作为只读文本框怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、需求当前在开发的系统需要一个...
      99+
      2023-07-05
    • WPF中下拉框可作选择项也可以作为只读文本框使用的方法
      目录1、需求2、现有的ComboBox(1)不设置任何参数(2)设置ComboBox.IsEditable=true3、使用VisualTreeHelper单独处理TextBox4、...
      99+
      2023-02-09
      wpf 下拉框 wpf下拉框控件 wpf用户控件下拉文本框
    • 使用jquery怎么实现户籍地选择下拉框
      今天就跟大家聊聊有关使用jquery怎么实现户籍地选择下拉框,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。data.jsvar data = [{&nb...
      99+
      2023-06-15
    • PyQt5中使用QtDesigner怎么实现文本框读写操作
      PyQt5中使用QtDesigner怎么实现文本框读写操作?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。主要内容:读、写 输入控件(Input Widgets)...
      99+
      2023-06-15
    • 怎么使用jQuery实现下拉框选中跳转功能
      今天小编给大家分享一下怎么使用jQuery实现下拉框选中跳转功能的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。首先,让我们来...
      99+
      2023-07-06
    • 为什么越来越多的ASP开发者选择使用Spring Shell作为前端框架?
      随着互联网的迅速发展,Web应用程序的开发越来越受到广泛关注。对于ASP.NET开发人员而言,选择一个优秀的前端框架是非常重要的,因为这直接影响到应用程序的质量和性能。在这篇文章中,我们将探讨为什么越来越多的ASP.NET开发人员选择使用S...
      99+
      2023-08-17
      响应 spring shell
    • SpringBoot中怎么使用JPA作为数据持久化框架
      今天小编给大家分享一下SpringBoot中怎么使用JPA作为数据持久化框架的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。J...
      99+
      2023-07-05
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作