C#ComboBox GotFocus

11 c# wpf combobox focus

我有一个ComboBox使用WPF 的C#.我有,当执行代码ComboBoxGotFocus被激活.问题是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)

从这个示例中选择您的应用程序实际需要的内容.


pie*_*rre 0

我不太热衷于 WPF;但如果您尝试检测列表的更改(单击新值等),您可以使用 SelectedIndexChanged 事件。

另一方面,如果您确实想简单地知道控件何时获得焦点,您可以通过说以下内容来过滤它:

if (combo1.Focused && combo1.SelectedIndex == -1)
{
     ...
}
Run Code Online (Sandbox Code Playgroud)

..?这实际上取决于您想要检测的内容。