再一次,我找不到一个简洁的解决方案来解决WPF中的简单UI问题。我希望每当组合框获得焦点时,组合框下拉列表就会出现。所以我在焦点事件中写了这个:
private void comboBoxAC_Cat_GotFocus(object sender, RoutedEventArgs e)
{
comboBoxAC_Cat.IsDropDownOpen = true;
}
但现在的问题是,一旦下拉列表打开,应用程序就会陷入其中。无论我做什么,无论是按回车还是其他任何东西,它都不能从下拉列表中出来。我尝试注册失去焦点或其他事件,但似乎没有任何工作。这是我在应用程序中的事件处理程序列表,一旦进入下拉列表就变得无用。
private void Grid_PreviewKeyDown(object sender, KeyEventArgs e)
{
var uie = e.OriginalSource as UIElement;
if (e.Source is Button)
return;
if (e.Key == Key.Enter)
{
e.Handled = true;
uie.MoveFocus(
new TraversalRequrest(
FocusNavigationDiection.Next));
}
}
private void comboBoxAC_Cat_LostFocus(object sender, RoutedEventArgs e)
{
(sender as ComboBox).IsDropDownOpen = false;
}
任何人都可以帮我解决这个问题吗?
我的基本要求很简单:只要使用制表符或鼠标聚焦Combobox,就会打开下拉列表。然后用户应该能够选择项目,一旦他按下Enter键从下拉列表中选择一个项目,它应该关闭并且焦点应该移动到下一个ui元素。
现在很难实现???我认为这正是组合框的功能
答案 0 :(得分:2)
我不明白,如果我使用下面的代码
private bool returnedFocus = false;
private void myComboBox_GotFocus(object sender, RoutedEventArgs e)
{
if (e.OriginalSource.GetType() != typeof(ComboBoxItem) && !returnedFocus)
{
cmb.IsDropDownOpen = true;
}
}
private void myComboBox_LostFocus(object sender, RoutedEventArgs e)
{
if (e.OriginalSource.GetType() != typeof(ComboBoxItem))
{
ComboBox cb = (ComboBox)sender;
returnedFocus = cb.IsDropDownOpen;
}
}
我得到了我认为你想要的东西,当控制得到焦点时我的组合框下拉打开,如果我选择一个列表项目按下输入或通过鼠标点击控制失去焦点
这不是你想要的吗?