2

問題

Lync には、ContactList コントロールのタブを変更するためのホットキー/ショートカット キーがいくつかあります。これらのホットキーは「g」、「s」、および「r」です。Web ページの WebBrowser 内で HTML 入力コントロールをフォーカスしているときにこれらのキーのいずれかを押すと、キーを押すと、WebBrowser コントロールではなく ContactList コントロールに移動します。WPF TextBox コントロールなど、ブラウザーの外部にあるコントロールに入力するときに、キーの押下が盗まれることはありません。

問題を再現する手順

  1. Microsoft Lync 2013 がインストールされている
  2. Microsoft Lync 2013 クライアント SDK をhttp://www.microsoft.com/en-au/download/details.aspx?id=36824からダウンロードしてインストールします。
  3. .net 4.0 wpf アプリケーションを作成します。ContactList コントロールを MainWindow にドラッグ アンド ドロップして、参照と名前空間を自動的に設定します。
  4. MainWindow.xaml の Window 要素内に次のコードを貼り付けます。

    <Window...
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="auto" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>
        <controls:ContactList Name="contactList1" Grid.Column="0" />
        <WebBrowser Grid.Column="1" Source="http://www.google.com"  />
    </Grid>
    

  5. 'r'、'g'、または 's' キーを google 検索ボックスに入力すると、キーを押すと検索ボックスではなく lync コントロールに移動することに注意してください。他のキーは通常どおり機能します。

私が試したこと

ContactList コントロールへのキー イベントのバブリングを停止しようとしました。しかし、私はこれであまり成功していません。

イベントバブリングを無効にする c# wpf

WPFは、コントロール外でのイベントのバブリングを防ぎます

4

1 に答える 1

1

ここで答えを見つけました: AccessKey Pressed Event Raised when press access key without ALT

この動作は、AccessKeys が機能するために WPF が Alt キーを押し続ける必要がないために発生します。WinFormsが行う場所。この場合、WebBrowser 内から「g」、「s」、または「r」を押すと、ClientControl がフォーカスされますが、alt を押したときにのみこれが発生するようにしたいと考えています。ただし、この問題が WebBrowser でのみ発生するように見える理由はわかりません。

msdn リンクから:

テキスト ボックスにフォーカスを与えるアクセス キーをラベルに定義しました。

同じユーザー コントロールに 2 つ目の読み取り専用テキスト ボックスがあります。

読み取り専用のテキスト ボックス内をクリックし、ALT を使用せずにアクセス キー (たとえば、ALT + L ではなく L) を押すと、フォーカスの変更は行われます。

この動作を無効にすることはできますか、つまり、アクセス キーが ALT と一緒に押されたときにのみ機能するようにすることは可能ですか?

次の xaml は問題を示しています。

<Window x:Class="Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
SizeToContent="Height"
Width="300" WindowStartupLocation="CenterScreen">
    <StackPanel Orientation="Vertical">
        <TextBox IsReadOnly="True" Text="ReadOnly - give focus and press l" />
        <Label Content="_Label:"  Target="{Binding ElementName=box}"/>
        <TextBox x:Name="box" />
    </StackPanel>
</Window>

ソリューション

メニューとツールバーのメモニックは、Alt キーを押さなくても機能します。Alt キーを押さずにキー操作にアクセスできるように、すべてのケースで動作を統一することにしました。

これは Forms と同等ではないことを理解しています。この問題を検討し、次のバージョンで動作を変更します。

今のところ、回避策として、すべての AccessKeyPressed イベントのクラス ハンドラーを再構築し、Alt キーが押されていない場合にイベントを処理できます。

EventManager.RegisterClassHandler(typeof(UIElement), AccessKeyManager.AccessKeyPressedEvent, new AccessKeyPressedEventHandler(OnAccessKeyPressed));

private void OnAccessKeyPressed(object sender, AccessKeyPressedEventArgs e)
{
    if (!e.Handled && e.Scope == null && (e.Target == null || e.Target == label))
    {
        // If Alt key is not pressed - handle the event
        if ((Keyboard.Modifiers & ModifierKeys.Alt) != ModifierKeys.Alt)
        {
            e.Target = null;
            e.Handled = true;
        }
    }
}

ソリューション コードを MainWindow クラスに追加すると、すべてが期待どおりに機能します。

于 2013-05-02T23:44:56.517 に答える