找回密码
 立即注册

QQ登录

只需一步,快速开始

q406157290

高级会员

124

主题

531

帖子

1359

积分

高级会员

积分
1359

活字格认证

q406157290
高级会员   /  发表于:2015-10-13 12:23  /   查看:10514  /  回复:13
打开C1ComboBox 后,当前选择项的类型就显示出来了,如何解决该问题呢


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

13 个回复

倒序浏览
KNight
中级会员   /  发表于:2015-10-13 13:28:00
沙发
回复 1楼q406157290的帖子

需要实现ItemConverter
回复 使用道具 举报
q406157290
高级会员   /  发表于:2015-10-13 14:02:00
板凳
回复 2楼KNight的帖子

能稍微再详细些吗 谢谢您
回复 使用道具 举报
KNight
中级会员   /  发表于:2015-10-13 14:19:00
地板
回复 3楼q406157290的帖子

可否把您的Demo发给我一份,方便在您的基础上实现;
回复 使用道具 举报
q406157290
高级会员   /  发表于:2015-10-13 14:27:00
5#
回复 4楼KNight的帖子

demo  忘记上传了 谢谢您  在问题上已上传 麻烦了
回复 使用道具 举报
KNight
中级会员   /  发表于:2015-10-13 17:07:00
6#
回复 5楼q406157290的帖子

你是想用C1ComboBox控件,然后下拉列表打开后同WPF自带的ComboBox相同,本身还是显示一个按钮和其Name值,是吧?


如果你想下拉张开时,本身显示Name,离开时既可显示按钮,又可显示Name,只需要实现C1ComboBox的TypeConverter即可:
  1. public class CustomTypeConverter : TypeConverter
  2. {
  3.         public override object ConvertTo(ITypeDescriptorContext context,
  4.                 CultureInfo culture, object value, Type destinationType)
  5.         {
  6.                 if (destinationType == typeof(string))
  7.                 {
  8.                         return ((Person)value).Name;
  9.                 }
  10.                 return "";
  11.         }
  12. }
  13. PointTypeBox.ItemConverter = new CustomTypeConverter();
复制代码





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

评分

参与人数 1金币 +999 收起 理由
Alice + 999 奖励金币

查看全部评分

回复 使用道具 举报
q406157290
高级会员   /  发表于:2015-10-13 17:24:00
7#
回复 6楼KNight的帖子

这个在您给我提示后我自己弄出来了
抱歉刚才的提问有些变化
能否实现 选择完后 把button 和name 都同时显示出来(不离开的状态下)
最理想的状态就是选择完毕后 Tempalte中的内容全部显示在ComboBox中,如果这种没有办法实现
那就只显示Name(但是离开的时候也只要显示Name,而不要Button)
真的麻烦您了
回复 使用道具 举报
KNight
中级会员   /  发表于:2015-10-14 09:49:00
8#
回复 7楼q406157290的帖子

首先先说明一下,C1ComboBox的

部分是由两个控件(EditControl 和ContentControl)叠加实现的效果,而这两个控件之间的切换效果更新方法如下:
  1. protected internal void UpdateVisualState()
  2. {
  3.         if (this.EditControl == null || this.ContentControl == null)
  4.         {
  5.                 return;
  6.         }
  7.         if (this.IsInEditMode || this.IsDropDownOpen)
  8.         {
  9.                 this.EditControl.Opacity = 1.0;
  10.                 this.EditControl.IsTabStop = true;
  11.                 this.EditControl.IsHitTestVisible = true;
  12.                 this.ContentControl.Visibility = Visibility.Collapsed;
  13.                 this.ContentControl.Content = null;
  14.         }
  15.         else
  16.         {
  17.                 this.EditControl.Opacity = 1.4012984643248171E-45;
  18.                 this.EditControl.IsTabStop = false;
  19.                 this.EditControl.IsHitTestVisible = false;
  20.                 this.ContentControl.Visibility = Visibility.Visible;
  21.                 this.ContentControl.Content = this.ActualContent;
  22.         }
  23.         base.Cursor = (this.IsEditable ? Cursors.IBeam : Cursors.Arrow);
  24. }
  25. // 注:C1ComboBox->C1EditableContentControl->EditControl/ContentControl
复制代码

所以只要保证你下拉选择完成后 this.IsInEditMode || this.IsDropDownOpen 的值为false即可,故添加如下代码:
  1. Loaded += (sender, e) =>
  2. {
  3.         _editBox = GetChildObjects<C1TextEditableContentControl>(PointTypeBox,
  4.                 typeof(C1TextEditableContentControl))[0];
  5.         PointTypeBox.IsDropDownOpenChanged += (sender2, e2) =>
  6.         {
  7.                 _editBox.IsInEditMode = false;
  8.         };
  9. };
复制代码

其中GetChildObjects方法为获取子控件的方法:
  1. public List<T> GetChildObjects<T>(DependencyObject obj, Type typename) where T : FrameworkElement
  2. {
  3.         DependencyObject child = null;
  4.         List<T> childList = new List<T>();

  5.         for (int i = 0; i <= VisualTreeHelper.GetChildrenCount(obj) - 1; i++)
  6.         {
  7.                 child = VisualTreeHelper.GetChild(obj, i);

  8.                 if (child is T &amp;&amp; (((T)child).GetType() == typename))
  9.                 {
  10.                         childList.Add((T)child);
  11.                 }
  12.                 childList.AddRange(GetChildObjects<T>(child, typename));
  13.         }
  14.         return childList;
  15. }
复制代码


这样可以保证你下拉选择完成后,即可将DataTemplate的内容完全显示在图中的位置;但是当鼠标在其上获取焦点时,仍旧是会变成字符串,即显示其中EditControl控件的;

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

评分

参与人数 1金币 +999 满意度 +5 收起 理由
Alice + 999 + 5 厉害

查看全部评分

回复 使用道具 举报
q406157290
高级会员   /  发表于:2015-10-14 10:33:00
9#
回复 8楼KNight的帖子

厉害真的太厉害了 谢谢您
下拉选择完成后,即可将DataTemplate的内容完全显示在图中的位置
但是当鼠标在其上获取焦点时,能否不变成字符串,还是该DataTemplate控件,并且DataTemplate中的Button可以点击
回复 使用道具 举报
KNight
中级会员   /  发表于:2015-10-14 12:03:00
10#
回复 9楼q406157290的帖子

有一种解决方案是:
展开下拉菜单时,最上面那里显示字符串(Name),而不是显示完整的DataTemplate控件,但是可以保证当焦点在C1ComboBox时会显示完整的DataTemplate控件的;此时只需要在上面的代码基础上加上:
  1. _editBox.IsEditable = false;
  2. _editBox.GotFocus += (sender2, e2) =>
  3. {
  4.         _editBox.IsInEditMode = false;
  5.         _editBox.IsTabStop = true;
  6. };

  7. PointTypeBox.IsDropDownOpenChanged += (sender2, e2) =>
  8. {
  9.         _editBox.IsInEditMode = false;// 貌似无效
  10. };
复制代码

如果先要显示的字符串为Name字段,则需要加上之前说的ItemConverter;

还有一种就是要实现和WPF自带的ComboBox完全一样的效果,这个比较麻烦一些,因为C1ComboBox在展开下拉框时,IsDropDownOpen属性为true,而且它会自动调用其中一个UpdateSwappedOut()方法,修改_editBox的ActualContent属性,以触发UpdateVisualState()来调换EditControl和EditControl两个控件;但是UpdateSwappedOut()的方法触发,以及其中对ActualContent属性的修改触发UpdateVisualState(),我都没有找到可在外面控制的;所以,狠狠心,就把UpdateSwappedOut()给整出来,然后自己控制这两个控件的调换:
首先声明两个全局控件变量:
  1. Control EditControl;
  2. ContentPresenter ContentControl;
复制代码


其次在加载完成后通过GetChildObjects获取该两个控件:
  1. EditControl = GetChildObjects<Control>(PointTypeBox, "EditControl")[0];
  2. ContentControl = GetChildObjects<ContentPresenter>(PointTypeBox, "ContentControl")[0];
  3. _editBox = GetChildObjects<C1TextEditableContentControl>(PointTypeBox,
  4.         typeof(C1TextEditableContentControl))[0];
  5. _editBox.IsEditable = false;
  6. // 保证在触发C1ComboBox焦点时,不会变成编辑控件
  7. _editBox.GotFocus += (sender2, e2) =>
  8. {
  9.         _editBox.IsInEditMode = false;
  10.         _editBox.IsTabStop = true;
  11. };

  12. PointTypeBox.IsDropDownOpenChanged += (sender2, e2) =>
  13. {
  14.         UpdateVisualState();
  15. };
复制代码

  1. private void UpdateVisualState()
  2. {
  3.         if (this.EditControl == null || this.ContentControl == null)
  4.         {
  5.                 return;
  6.         }
  7.         this.EditControl.Opacity = 1.4012984643248171E-45;
  8.         this.EditControl.IsTabStop = false;
  9.         this.EditControl.IsHitTestVisible = false;
  10.         this.ContentControl.Visibility = Visibility.Visible;
  11.         C1ComboBoxItem cmbi = ((C1ComboBoxItem)PointTypeBox.ItemContainerGenerator.ContainerFromIndex(PointTypeBox.SelectedIndex));
  12.         this.ContentControl.Content = cmbi.Content;
  13.         base.Cursor = (_editBox.IsEditable ? Cursors.IBeam : Cursors.Arrow);
  14. }
复制代码


算是给了个下下策的解决方案了...希望能用上!
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部