WPF アプリケーション全体で Enter キーを Tab キーとして解釈したい、つまり、ユーザーが Enter キーを押したときにアプリケーションのどこでも、ボタンがフォーカスされている場合を除いて、次のフォーカス可能なコントロールにフォーカスしたい。アプリケーションライフサークルでそれを行う方法はありますか? 誰かが私に例を挙げてもらえますか?
どうもありがとう!
15070 次
5 に答える
39
必要に応じて、私のEnterKeyTraversal 添付プロパティコードを使用できます。これを WPF ウィンドウの最上位コンテナーに追加すると、内部のすべてがタブとして扱われます。
<StackPanel my:EnterKeyTraversal.IsEnabled="True">
...
</StackPanel>
于 2009-05-16T04:06:34.640 に答える
4
XAML の特定の要素 (ボタン、コンボボックス、または Enter キー トラバーサルを無視したいもの) に FrameworkElement.Tag (値は IgnoreEnterKeyTraversal) を追加することで、woodyiii の問題を回避しました。次に、添付プロパティでこのタグと値を探しました。そのようです:
if (e.Key == Key.Enter)
{
if (ue.Tag != null && ue.Tag.ToString() == "IgnoreEnterKeyTraversal")
{
//ignore
}
else
{
e.Handled = true;
ue.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
}
}
于 2011-01-21T18:51:32.843 に答える
0
woodyiii、UIElement
呼び出された関数にはPredictFocus()
、その名前でその関数がわかっている関数があり、その要素が有効かどうかを確認して、フォーカスをそれに移動するかどうかを確認できます...
于 2010-09-04T12:45:54.247 に答える
0
Matt Hamilton のコードは、彼のサイトが明らかにダウンしているため、誰かが疑問に思っている場合です。
public class EnterKeyTraversal
{
public static bool GetIsEnabled(DependencyObject obj)
{
return (bool)obj.GetValue(IsEnabledProperty);
}
public static void SetIsEnabled(DependencyObject obj, bool value)
{
obj.SetValue(IsEnabledProperty, value);
}
static void ue_PreviewKeyDown(object sender, System.Windows.Input.KeyEventArgs e)
{
var ue = e.OriginalSource as FrameworkElement;
if (e.Key == Key.Enter)
{
e.Handled = true;
ue.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
}
}
private static void ue_Unloaded(object sender, RoutedEventArgs e)
{
var ue = sender as FrameworkElement;
if (ue == null) return;
ue.Unloaded -= ue_Unloaded;
ue.PreviewKeyDown -= ue_PreviewKeyDown;
}
public static readonly DependencyProperty IsEnabledProperty =
DependencyProperty.RegisterAttached("IsEnabled", typeof(bool),
typeof(EnterKeyTraversal), new UIPropertyMetadata(false, IsEnabledChanged));
static void IsEnabledChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var ue = d as FrameworkElement;
if (ue == null) return;
if ((bool)e.NewValue)
{
ue.Unloaded += ue_Unloaded;
ue.PreviewKeyDown += ue_PreviewKeyDown;
}
else
{
ue.PreviewKeyDown -= ue_PreviewKeyDown;
}
}
}
于 2020-02-22T16:53:05.260 に答える