gpt4 book ai didi

C# 组合框 GotFocus

转载 作者:可可西里 更新时间:2023-11-01 08:43:19 25 4
gpt4 key购买 nike

我有一个使用 WPF 的 C# ComboBox。我有在 ComboBoxGotFocus 被激活时执行的代码。问题是每次从 ComboBox 中进行选择时都会执行 GotFocus 事件。例如,当您第一次单击 ComboBox 时执行 GotFocus,然后在您进行选择时执行,即使您没有单击任何其他控件也是如此。

如果在列表中进行选择,或者事件处理程序中是否有标志或其他东西可用于确定 GotFocus 事件是否发生,是否有可能阻止触发此事件处理程序因用户选择列表中的项目而被触发?

最佳答案

你可以通过下一次验证来解决这个问题:

private void myComboBox_GotFocus(object sender, RoutedEventArgs e)
{
if (e.OriginalSource.GetType() == typeof(ComboBoxItem))
return;
//Your code here
}

此代码将从项目中过滤所有焦点事件(因为它们使用冒泡路由事件)。但是还有另一个问题 - 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);
}
}

所以无论如何你都会得到至少两个焦点事件:当你选择 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;
}
}

从这些示例中选择您的应用程序实际需要更多的内容。

关于C# 组合框 GotFocus,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1554630/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com