回复 9楼q406157290的帖子
有一种解决方案是:
展开下拉菜单时,最上面那里显示字符串(Name),而不是显示完整的DataTemplate控件,但是可以保证当焦点在C1ComboBox时会显示完整的DataTemplate控件的;此时只需要在上面的代码基础上加上:
- _editBox.IsEditable = false;
- _editBox.GotFocus += (sender2, e2) =>
- {
- _editBox.IsInEditMode = false;
- _editBox.IsTabStop = true;
- };
- PointTypeBox.IsDropDownOpenChanged += (sender2, e2) =>
- {
- _editBox.IsInEditMode = false;// 貌似无效
- };
复制代码
如果先要显示的字符串为Name字段,则需要加上之前说的ItemConverter;
还有一种就是要实现和WPF自带的ComboBox完全一样的效果,这个比较麻烦一些,因为C1ComboBox在展开下拉框时,IsDropDownOpen属性为true,而且它会自动调用其中一个UpdateSwappedOut()方法,修改_editBox的ActualContent属性,以触发UpdateVisualState()来调换EditControl和EditControl两个控件;但是UpdateSwappedOut()的方法触发,以及其中对ActualContent属性的修改触发UpdateVisualState(),我都没有找到可在外面控制的;所以,狠狠心,就把UpdateSwappedOut()给整出来,然后自己控制这两个控件的调换:
首先声明两个全局控件变量:
- Control EditControl;
- ContentPresenter ContentControl;
复制代码
其次在加载完成后通过GetChildObjects获取该两个控件:
- EditControl = GetChildObjects<Control>(PointTypeBox, "EditControl")[0];
- ContentControl = GetChildObjects<ContentPresenter>(PointTypeBox, "ContentControl")[0];
- _editBox = GetChildObjects<C1TextEditableContentControl>(PointTypeBox,
- typeof(C1TextEditableContentControl))[0];
- _editBox.IsEditable = false;
- // 保证在触发C1ComboBox焦点时,不会变成编辑控件
- _editBox.GotFocus += (sender2, e2) =>
- {
- _editBox.IsInEditMode = false;
- _editBox.IsTabStop = true;
- };
- PointTypeBox.IsDropDownOpenChanged += (sender2, e2) =>
- {
- UpdateVisualState();
- };
复制代码
- private void UpdateVisualState()
- {
- if (this.EditControl == null || this.ContentControl == null)
- {
- return;
- }
- this.EditControl.Opacity = 1.4012984643248171E-45;
- this.EditControl.IsTabStop = false;
- this.EditControl.IsHitTestVisible = false;
- this.ContentControl.Visibility = Visibility.Visible;
- C1ComboBoxItem cmbi = ((C1ComboBoxItem)PointTypeBox.ItemContainerGenerator.ContainerFromIndex(PointTypeBox.SelectedIndex));
- this.ContentControl.Content = cmbi.Content;
- base.Cursor = (_editBox.IsEditable ? Cursors.IBeam : Cursors.Arrow);
- }
复制代码
算是给了个下下策的解决方案了...希望能用上! |