最近在寫一個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 簡單兩句代碼就可以實現啦。小東西,目的是為了培養自己寫博客的習慣。