我有一个 C#ComboBox
使用 WPF。我有在以下情况下执行的代码ComboBox
's GotFocus
被激活。问题是GotFocus
每次从以下位置进行选择时都会执行事件ComboBox
。例如,GotFocus
当您第一次点击时执行ComboBox
然后当您做出选择时,即使您没有单击任何其他控件。
如果在列表中进行选择,是否可以阻止此事件触发,或者事件处理程序中是否有标志或其他内容可用于确定是否GotFocus
由于用户选择列表中的项目而触发了事件处理程序?
您可以通过下一步验证来解决这个问题:
private void myComboBox_GotFocus(object sender, RoutedEventArgs e)
{
if (e.OriginalSource.GetType() == typeof(ComboBoxItem))
return;
//Your code here
}
此代码将过滤项目中的所有焦点事件(因为它们使用气泡路由事件)。但还有另一个问题 - WPF ComboBox 焦点的特定行为:当您打开包含项目的下拉列表时,您的 ComboBox 会失去焦点而项目会获得焦点。当您选择某个项目时 - 项目失去焦点并且组合框返回。下拉列表就像另一个控件。您可以通过简单的代码看到这一点:
private void myComboBox_GotFocus(object sender, RoutedEventArgs e)
{
if (e.OriginalSource.GetType() != typeof(ComboBoxItem))
{
Trace.WriteLine("Got " + DateTime.Now);
}
}
private void myComboBox_LostFocus(object sender, RoutedEventArgs e)
{
if (e.OriginalSource.GetType() != typeof(ComboBoxItem))
{
Trace.WriteLine("Lost " + DateTime.Now);
}
}
因此,无论如何,您至少会收到两个焦点事件:当您选择 ComboBox 时以及当您在其中选择某些内容时(焦点将返回到 ComboBox)。
要过滤选择项目后返回的焦点,您可以尝试使用DropDownOpened
/DropDownClosed
带有一些字段标志的事件。
所以最终的代码只有 1 个获得焦点的事件:
private bool returnedFocus = false;
private void myComboBox_GotFocus(object sender, RoutedEventArgs e)
{
if (e.OriginalSource.GetType() != typeof(ComboBoxItem) && !returnedFocus)
{
//Your code.
}
}
private void myComboBox_LostFocus(object sender, RoutedEventArgs e)
{
if (e.OriginalSource.GetType() != typeof(ComboBoxItem))
{
ComboBox cb = (ComboBox)sender;
returnedFocus = cb.IsDropDownOpen;
}
}
从这些示例中选择您的应用程序实际需要的更多内容。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)