我有一个ComboBox使用WPF 的C#.我有,当执行代码ComboBox的GotFocus被激活.问题是GotFocus每次从中选择时都会执行事件ComboBox.例如,即使您没有单击任何其他控件,GotFocus也会在您第一次单击时执行ComboBox,然后在您进行选择时执行.
如果在列表中进行选择,或者事件处理程序中是否有标志或其他内容可用于确定是否GotFocus由于用户选择了事件处理程序而触发事件处理程序,是否可以阻止此事件触发列表中的项目?
Kyr*_*o M 13
您可以通过下一次验证解决此问题:
private void myComboBox_GotFocus(object sender, RoutedEventArgs e)
{
if (e.OriginalSource.GetType() == typeof(ComboBoxItem))
return;
//Your code here
}
Run Code Online (Sandbox Code Playgroud)
此代码将过滤项目中的所有焦点事件(因为它们使用气泡路由事件).但是还有另一个问题 - WPF ComboBox焦点的特定行为:当您打开包含项目的下拉列表时,您的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);
}
}
Run Code Online (Sandbox Code Playgroud)
因此,无论如何你都会得到至少两个焦点事件:当你选择ComboBox时以及当你选择它时(焦点将返回到ComboBox).
要在选择项目后过滤返回的焦点,可以尝试将DropDownOpened/ DropDownClosedevents与某些field-flag一起使用.
所以最终的代码只有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;
}
}
Run Code Online (Sandbox Code Playgroud)
从这个示例中选择您的应用程序实际需要的内容.
我不太热衷于 WPF;但如果您尝试检测列表的更改(单击新值等),您可以使用 SelectedIndexChanged 事件。
另一方面,如果您确实想简单地知道控件何时获得焦点,您可以通过说以下内容来过滤它:
if (combo1.Focused && combo1.SelectedIndex == -1)
{
...
}
Run Code Online (Sandbox Code Playgroud)
..?这实际上取决于您想要检测的内容。
| 归档时间: |
|
| 查看次数: |
8495 次 |
| 最近记录: |