最近在寫一個WPF客戶端的一個小程序,其中有個小需求如下:
- 展示下拉列表里面有樹形結構
- 點擊下拉子項時同時顯示父級和子級文本
也就是說在DisplayMember 中有兩種顯示方式
- 下拉列表顯示時,顯示的是DisplayMember 的值
- 點擊選中子項時,需要計算子級和父級的文本并進行拼接,然后顯示在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 簡單兩句代碼就可以實現啦。小東西,目的是為了培養自己寫博客的習慣。
?