WPF 中設置Combox下拉框Text 顯示值


最近在寫一個WPF客戶端的一個小程序,其中有個小需求如下:

  1. 展示下拉列表里面有樹形結構
  2. 點擊下拉子項時同時顯示父級和子級文本

也就是說在DisplayMember 中有兩種顯示方式

  1. 下拉列表顯示時,顯示的是DisplayMember 的值
  2. 點擊選中子項時,需要計算子級和父級的文本並進行拼接,然后顯示在combox 中

一開始沒有多想就想應該直接設置combox.Text 不就可以搞定了么,問題很簡單的嘛!於是就設置了下

發現不起作用!最后查了msdn 說是combox 的 IsEditable=true 時 設置下拉框的Text才有效,於是就啟用了IsEditable,運行調試發現仍然沒有卵用!!

問題來了,怎么搞?那換個思路,重寫Combox ? 我覺得太麻煩,就沒有往這方面想,畢竟界面用的沒有幾個下拉框。那有沒有什么先簡單的方式呢?

我的思路:

    使用Textbox做高寬統一放置在Combox的上方,漏出下拉框的下拉箭頭,把Textbox做成透明層(這里不是界面透明,是事件穿透哦),把Combox 與Textbox 分組為一組Gird中 做好高寬自動同步拉伸,注意在控件命名的時候最好有規律哦,后面要用到的。

xaml如下:

         <Grid Margin="62,4,220,33">
                    <ComboBox x:Name="cmbCategoryAdd1"/>
                    <TextBox IsReadOnly="True" x:Name="txtcmbCategoryAdd1" Text="" Margin="0,0,18,0"/>
         </Grid>

顯示如下

選擇:  未選擇:

有沒有感覺很逼真,其實上方是Textbox,好吧,現在要把Textbox 做成透明層代碼如下:

            TextBox text = window.GetControlByName<TextBox>("txt" + comboBox.Name);
            text.Text = comboBox.GetComboxSelectedValue();
            text.IsHitTestVisible = false;//設置文本框為透明層

這就把Textbox 設置為透明層啦!下面來做下拉框選中以后改變Textbox 的值:

            //下拉框選擇變化時發生
            comboBox.SelectionChanged+=new SelectionChangedEventHandler((sender, args) =>
            {
                TextBox text2 = window.GetControlByName<TextBox>("txt" + comboBox.Name);
                text2.Text = comboBox.GetComboxSelectedValue();
            });

代碼里的window就是當前窗口(this),GetControlByName 也貼出來

        #region 根據控件名稱,查找控件
        /// <summary>
        /// 根據控件名稱,查找控件
        /// </summary>
        public static T GetControlByName<T>(this Window obj, string elementName) where T : FrameworkElement
        {
            return ((T)obj.FindName(elementName));
        }
        #endregion
現在查看下效果

嗯,不錯,效果還是很滿意的,沒有重寫Combox,這樣放置個透明Textbox 簡單兩句代碼就可以實現啦。小東西,目的是為了培養自己寫博客的習慣。

 
        

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM