2017-03-08 70 views
0

我有一个ComboBox动态创建的,我已经设置下列属性:防止项目选择在组合框(或,AutoSuggestTextBox而不ItemSelection)

var keyUpHandler = new KeyEventHandler(
(s, e) => 
{ 
    var cell = s as UIElement; 

    if (e.Key == Key.Up) 
    { 
     cell.MoveFocus(new TraversalRequest(FocusNavigationDirection.Up)); 
    } 
    else if (e.Key == Key.Right) 
    { 
     cell.MoveFocus(new TraversalRequest(FocusNavigationDirection.Right)); 
    } 
    else if (e.Key == Key.Down) 
    { 
     cell.MoveFocus(new TraversalRequest(FocusNavigationDirection.Down)); 
    } 
    else if (e.Key == Key.Left) 
    { 
     cell.MoveFocus(new TraversalRequest(FocusNavigationDirection.Left)); 
    } 
}); 

ComboBox cb = new ComboBox(); 
Grid.SetRow(cb, row); 
Grid.SetColumn(cb, col); 
cb.IsEditable = true; 
cb.DataContext = myDataContext; 
cb.ItemsSource = myDataItems; 
cb.FocusVisualStyle = null; 
cb.KeyUp += keyUpHandler; 
cb.Resources.Add(SystemParameters.VerticalScrollBarWidthKey, 0.0); 
myGrid.Children.Add(cb); 

ComboBox是我想它像一个AutoSuggestTextBox作用可编辑。它是一个动态Grid的一部分,它是一个具有相同大小的行和列的表结构。我正在使用箭头键将焦点移至Grid内的相邻单元格。

我的问题是,在使用向上箭头键时,我需要将焦点导航到上方/下方控件,而不是ComboBox的默认选择项目。

我该怎么做?

回答

1

您需要创建一个自定义ComboBox类覆盖OnPreviewKeyDown方法:

public class CustomComboBox : ComboBox 
{ 
    protected override void OnPreviewKeyDown(KeyEventArgs e) 
    { 
     if (e.Key == Key.Up) 
     { 
      this.MoveFocus(new TraversalRequest(FocusNavigationDirection.Up)); 
     } 
     else if (e.Key == Key.Right) 
     { 
      this.MoveFocus(new TraversalRequest(FocusNavigationDirection.Right)); 
     } 
     else if (e.Key == Key.Down) 
     { 
      this.MoveFocus(new TraversalRequest(FocusNavigationDirection.Down)); 
     } 
     else if (e.Key == Key.Left) 
     { 
      this.MoveFocus(new TraversalRequest(FocusNavigationDirection.Left)); 
     } 
     else 
     { 
      base.OnPreviewKeyDown(e); 
     } 
    } 
} 

ComboBox cb = new CustomComboBox(); 
Grid.SetRow(cb, row); 
Grid.SetColumn(cb, col); 
cb.IsEditable = true; 
cb.DataContext = myDataContext; 
cb.ItemsSource = myDataItems; 
cb.FocusVisualStyle = null; 
cb.Resources.Add(SystemParameters.VerticalScrollBarWidthKey, 0.0); 
myGrid.Children.Add(cb); 
+0

这工作,谢谢!我还需要设置'IsTabStop = true',这在我的默认组合框样式中设置为false。 –