1

テキスト ボックス コントロールを含むプログラムがあります。ユーザーは、このコントロールにテキストを入力できます。ユーザーは、特定のキーを押して他のアクションをトリガーすることもできます (これは MainWindow で処理されます)。セットアップを示すサンプル XAML および C# コードがあります。

XAML

<Window x:Class="RoutedEventBubbling.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition />
        </Grid.RowDefinitions>

        <TextBox Grid.Row="0" />
        <TextBox x:Name="Output" Grid.Row="1" IsReadOnly="True" />
    </Grid>
</Window>

C#

using System.Windows;
using System.Windows.Input;

namespace RoutedEventBubbling
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        private int mHitCount = 0;

        public MainWindow()
        {
            InitializeComponent();
        }

        protected override void OnKeyDown(KeyEventArgs e)
        {
            base.OnKeyDown(e);

            this.Output.Text = string.Format("Hit Count: {0}", ++mHitCount);
        }
    }
}

お気づきかもしれませんが、このプログラムの場合、最初TextBoxのプログラムに入力を開始すると、2 番目のプログラムのヒット カウントが更新されます。OnKeyDownMainWindow のメソッドを処理するときにトリガーしたい特定のアクションがある可能性があるため、これは望ましくない結果です。

OnKeyDownそのため、私の質問は次のとおりです。テキスト ボックスにテキストを入力できるようにしながら、MainWindow でメソッドが呼び出されるのを防ぐことは可能ですか? 私はe.Handled = trueアプローチを知っていますが、この場合、KeyDownイベントでそれTextBoxを行うと、テキストが入力されなくなります。これが不可能な場合は、すべてを処理する別の方法を見つける必要があります。

前もって感謝します。

編集

この問題を回避する適度にハックな方法を見つけました。代わりにMainWindow のOnTextInputメソッドを処理するTextInputと、意志のイベントTextBoxが処理されるため、目的の結果が得られます。以下は、私が使用したコードのサンプルです。

private Key mPressedKey;

protected override void OnKeyDown(KeyEventArgs e)
{
    // Note: This method will be called first.

    base.OnKeyDown(e);

    // Store the pressed key
    mPressedKey = e.Key;
}

protected override void OnTextInput(TextCompositionEventArgs e)
{
    // Note: This method will be called second, and only if the textbox hasn't handled it.

    base.OnTextInput(e);

    this.Output.Text = string.Format("Hit Count: {0}", ++mHitCount);

   // ... Handle pressed key ...
}
4

2 に答える 2

0

次のセットアップを使用して、この問題を回避することになりました。

private Key mPressedKey;

protected override void OnKeyDown(KeyEventArgs e)
{
    base.OnKeyDown(e);

    mPressedKey = e.Key;
}

protected override void OnTextInput(TextCompositionEventArgs e)
{
    base.OnTextInput(e);

    // ... Handle mPressedKey here ...
}

protected override void OnMouseDown(MouseButtonEventArgs e)
{
    base.OnMouseDown(e);

    // Force focus back to main window
    FocusManager.SetFocusedElement(this, this);
}

これは、MainWindow.xaml.cs で行われました。ちょっとハックですが、私が望んでいた結果が得られました。

于 2011-11-04T11:43:16.690 に答える
0

そのステートメントに型ベースのガードを置くことができます。

protected override void OnKeyDown(KeyEventArgs e)
{
    base.OnKeyDown(e);

    if (e.OriginalSource is TextBoxBase == false)
    {
        mPressedKey = e.Key;
    }
}

ただし、最善の解決策ではない可能性もあります。

于 2011-11-03T09:51:29.523 に答える