2013-03-20 85 views
6

我有下面的示例代码。奇怪的是,MouseMove事件正确触发,但是当用MouseEnter代替时,鼠标移过ComboBoxItem时没有任何反应。任何想法如何解决这个问题?我实际上需要一个事件发生在用户悬停在ComboBoxItem之上时,以及在悬停离开物品时发生的另一个事件。ComboBoxItem MouseEnter event not firing

var comboBoxItem1 = new ComboBoxItem(); 
var comboBoxItem2 = new ComboBoxItem(); 
cmb.Items.Add(comboBoxItem1); 
cmb.Items.Add(comboBoxItem2); 

comboBoxItem1.Content = "1"; 

comboBoxItem1.MouseMove += (s, args) => 
{ 
    MessageBox.Show("1"); 
}; 

comboBoxItem2.Content = "2"; 
comboBoxItem2.MouseMove += (s, args) => 
{ 
    MessageBox.Show("2"); 
}; 

编辑:

   StackPanel spCondition = new StackPanel(); 
       spCondition.Orientation = Orientation.Horizontal; 

       ComboBox cmbValue1 = new ComboBox(); 
       cmbValue1.IsTextSearchEnabled = false; 
       cmbValue1.IsEditable = true; 
       cmbValue1.Width = 70; 
       cmbValue1.LostFocus += cmbValue_LostFocus; 
       cmbValue1.PreviewMouseLeftButtonDown += cmbValue_MouseLeftButtonDown; 
       cmbValue1.SelectionChanged += cmbValue_SelectionChanged; 

       Border border = new Border(); 
       border.Child = cmbValue1; 

       spCondition.Children.Add(border); 

private void cmbValue_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
    { 
     ComboBox cmb = sender as ComboBox; 
     cmb.Items.Clear(); 

     //Iterates through all virtual tables 
     foreach (TableContainer table in parentTable.ParentVisualQueryBuilder.ListOpenUnjoinedTables) 
     { 
      ComboBoxItem item = new ComboBoxItem(); 
      item.MouseMove += item_MouseMove; 

      if (table.IsVirtual == false) 
      { 
       item.Content = "[" + table.TableDescription + "]"; 
      } 
      else 
      { 
       item.Content = "[" + table.View.Name + "]"; 
      } 

      item.Tag = table; 
      cmb.Items.Add(item); 
     } 
    } 
+0

您可以尝试在MessageBox.Show行上放置断点以查看它是否停在那里? – Yahya 2013-03-20 14:04:56

+0

@Yahya - 甚至不输入块! – WPF 2013-03-20 14:06:12

+1

“Windows事件”对我来说意味着别的东西。修正了你的标题。 – spender 2013-03-20 14:06:40

回答

0

我相信您要删除这个代码在ComboBox中的项目:

private void cmbValue_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
    { 
     ComboBox cmb = sender as ComboBox; 
     cmb.Items.Clear(); 

     //Iterates through all virtual tables 
     foreach (TableContainer table in parentTable.ParentVisualQueryBuilder.ListOpenUnjoinedTables) 
     { 
      ComboBoxItem item = new ComboBoxItem(); 
      item.MouseMove += item_MouseMove; 

      if (table.IsVirtual == false) 
      { 
       item.Content = "[" + table.TableDescription + "]"; 
      } 
      else 
      { 
       item.Content = "[" + table.View.Name + "]"; 
      } 

      item.Tag = table; 
      cmb.Items.Add(item); 
     } 
    } 

请尝试评论此代码并运行。

UPDATE:

你有这样的代码项添加到comoBox:

var comboBoxItem1 = new ComboBoxItem(); 
var comboBoxItem2 = new ComboBoxItem(); 
cmb.Items.Add(comboBoxItem1); 
cmb.Items.Add(comboBoxItem2); 

comboBoxItem1.Content = "1"; 

comboBoxItem1.MouseMove += (s, args) => 
{ 
    MessageBox.Show("1"); 
}; 

comboBoxItem2.Content = "2"; 
comboBoxItem2.MouseMove += (s, args) => 
{ 
    MessageBox.Show("2"); 
}; 

与此代码更改。

var comboBoxItem1 = new Label();//or use textBolck 
var comboBoxItem2 = new Label();//or use textBolck 
combo.Items.Add(comboBoxItem1); 
combo.Items.Add(comboBoxItem2); 

comboBoxItem1.Content = "1"; 

comboBoxItem1.MouseEnter += (s, args) => 
{ 
    MessageBox.Show("1"); 
}; 


comboBoxItem2.Content = "2"; 
comboBoxItem2.MouseEnter += (s, args) => 
{ 
    MessageBox.Show("2"); 
}; 
+0

不幸的是,我在那里注册了我的MouseEnter事件 – WPF 2013-03-20 15:08:41

+0

是的你是对的。首先,您要删除所有项目并将新项目添加到组合框。在这种情况下,您将无法看到MessegeBox。 – Dilshod 2013-03-20 15:11:55

+0

但是,如果我用MouseMove替换MouseEnter,它为什么会起作用?相同的代码,只是一个不同的事件 – WPF 2013-03-20 15:12:46

0

尝试使用PreviewMouseEnter事件。因为我猜测有一些元素会窃取事件,所以使用隧道事件应该会有所帮助。

+0

PreviewMouseEnter似乎不存在ComboBoxItem – WPF 2013-03-20 15:58:05