WPF 实现在Combobox下拉菜单展开,未选择,直接点击button自动收起下拉菜单,并响应button绑定事件

在正常情况下,下拉菜单展开后,我们都会选择一个合适的选项;

但是在某些时候,展开下拉菜单后,发现并不需要选择一个选项,只是需要进行后续操作,然后这时在点击其他位置的button时,你会发现:只有combobox的下拉菜单收起来了,但是button的绑定事件并未响应……

 

为了实现未选择下拉菜单,点击button时combobox能收起下拉菜单,并响应button的click事件,小子采用了下述方法(谁有更好办法,请留言指教):

  private void DropDownOpenFalse()
        {
            comboBox.IsDropDownOpen = false;
            comboBox2.IsDropDownOpen = false;
            comboBox3.IsDropDownOpen = false;
        }

        Dictionary<object, ICommand> keyValues = new Dictionary<object, ICommand>();
        private void IniKeyValue()
        {
            keyValues.Add(MainNeedleButton_CB, VM.SendMainNeedleData);
            keyValues.Add(FixedNeedleButton1_CB, VM.SendFixedNeedle1Data);
            keyValues.Add(FixedNeedleButton2_CB, VM.SendFixedNeedle2Data);
            keyValues.Add(FixedNeedleButton3_CB, VM.SendFixedNeedle3Data);
        }

        //为了解决combobox在下拉菜单打开,没做任何选择,直接点击按键时,按钮的click事件不响应
        private void NeedleButton_CB_PreviewMouseUp(object sender, MouseButtonEventArgs e)
        {
            DropDownOpenFalse();
            keyValues[(Button)sender].Execute(null);
        }
DropDownOpenFalse 为了将3个下拉菜单都收起。
IniKeyValue       实例化时,初始化keyValues;
注意其中的VM,为在xml中将引入的ViewModelf设置了一个x:name(如:<viewmodel:MainWindowsViewModel x:Name="VM"/>)。
NeedleButton_CB_PreviewMouseUp 调用button的PreviewMouseUp事件,实现收起下拉菜单,并调用绑定的ICommand执行。

为了方便添加button或其他控件,将button与执行的ICommand用Dictionary进行了键值绑定,同时也简化了代码……


以下代码为 七页 提供的demo:
  private void comboBox_Loaded(object sender, RoutedEventArgs e)
        {
            Popup popup = (Popup)cmbTest.Template.FindName("PART_Popup", cmbTest);
            popup.MouseLeave += Popup_MouseLeave;
        }

        private void Popup_MouseLeave(object sender, MouseEventArgs e)
        {
            cmbTest.IsDropDownOpen = false;
        }
此实现了光标离开comboBox的下拉列表,下拉列表就收起(如果点开后,光标未进入下拉列表区域,那么也是不能自动收起来的;
为此可以添加一个timer,点击comboBox时start timer,若超过一定时间光标未进入下拉列表Popup区域,则将下拉列表收起;
按此思路是可以将comboBox整合为一个自定义的控件,以供后续使用)。

注意上述  

(Popup)cmbTest.Template.FindName("PART_Popup", cmbTest);
也就是说,comboBox的下拉列表本质就是一个Popup,其名称默认为PART_Popup。

详细关于comboBox的样式, 可以参考ComboBox Styles and Templates - WPF .NET Framework | Microsoft Learn

 







 
posted @ 2023-06-19 16:44  盛沧海  阅读(947)  评论(0编辑  收藏  举报