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 的值:
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 简单两句代码就可以实现啦。⼩东西,⽬的是为了培养⾃⼰写博客的习惯。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论