3

レポート画面用に現在このように見えるデータテンプレートxamlがあります

   <CheckBox>
        <StackPanel>
            <TextBlock Text="{Binding Path=DisplayName}" FontWeight="Bold" Margin="0 0 0 5" />
            <RadioButton Content="All Pages" IsChecked="{Binding Path=AllPages}" Margin="0 0 0 5" />
            <RadioButton>
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="Pages: " Margin="0 3 5 0" />
                    <TextBox Width="130" Text="{Binding Path=SelectedValue}" />
                </StackPanel>
            </RadioButton>
        </StackPanel>
  </CheckBox>

「-」と「=」をチェックおよびチェック解除として使用するデフォルトのチェックボックスの動作を無効にする方法を知りたいです。

そのテキストボックスにユーザーがページ範囲として '1-5, 6, 7' を入力できるようにしたいのですが、'-' がボックスのチェックとチェック解除を行っているため、入力できません。

編集:チェックボックスのチェック+チェック解除のスペースバー機能を維持したいと思います。なんらかの理由で、テキスト ボックスにスペースを入力すると、トグル イベントはトリガーされませんが、「-」と「=」はトリガーされます。

EDIT2:MVVMアーキテクチャを維持しようとしており、コードビハインドを望まないため、理想的にはxamlの修正を探しています

4

3 に答える 3

3

CheckBox.OnKeyDown が原因です ( http://msdn.microsoft.com/en-us/library/system.windows.controls.checkbox.onkeydown.aspxを参照)。OnKeyDown をオーバーライドして何もしないカスタム CheckBox クラスを作成することで、これを解決しました。VB ソリューションは次のようになります。

Public Class IgnoreKeyboardCheckBox
    Inherits CheckBox

    Protected Overrides Sub OnKeyDown(e As System.Windows.Input.KeyEventArgs)
        If e.Key = Key.Space Then
            MyBase.OnKeyDown(e)
        End If
    End Sub
End Class

キーボード入力を無視するためにチェックボックスが必要な場合はいつでも、CheckBox の代わりにこのクラスを使用できます。

于 2012-10-11T12:40:58.010 に答える
1

こちらの CheckBox.cs source code in C# .NETに見られるように、2 状態のチェックボックスの場合、 のカスタム動作がありますKey.Add, Key.Subtract, Key.OemPlus, Key.OemMinus

(プログラム的に)コマンドを追加してもうまくいきませんでした。サブクラスでオーバーライドすると、次のことが行われました。

protected override void OnKeyDown(KeyEventArgs e)
{
  // Non ThreeState Checkboxes natively handle certain keys.
  if (SuppressNativeKeyDownBehaviour(e.Key))
    return;

  base.OnKeyDown(e);
}

private bool SuppressNativeKeyDownBehaviour(Key key)
{
  switch (key)
  {
    case Key.Add:
    case Key.Subtract:
    case Key.OemPlus:
    case Key.OemMinus:
      return true;
    default:
      return false;
  }
}
于 2016-06-10T08:36:32.220 に答える
0

キーボード ショートカットを空のコマンドでオーバーライドしてみてください。

<RadioButton>
        <KeyBinding Key="OemMinus" Command="{Binding EmptyCommand}"/>
</RadioButton>

そしてあなたのビューモデルで:

// System.windows.input を使用

public Icommand EmptyCommand = ApplicationCommands.NotACommand;
于 2012-07-10T11:40:31.333 に答える