11

イベント引数を として取得する必要がありますがchar、 Key 列挙型をキャストしようとすると、渡されたものとはまったく異なる文字と記号が取得されます。

キーを char に正しく変換するにはどうすればよいですか?

これは私が試したものです

ObserveKeyStroke(this, new ObervableKeyStrokeEvent((char)((KeyEventArgs)e.StagingItem.Input).Key));

編集:引数に KeyCode プロパティもありません。InputManager.Current.PreNotifyInput イベントから取得しています。

4

5 に答える 5

11

文字を同等の System.Windows.Input.Key Enum 値に変換する方法を参照してください。KeyInterop.VirtualKeyFromKey代わりに 使用してください。

于 2009-05-12T22:47:19.207 に答える
2

それは私のために働く:

最後のエントリに基づいて、WPFにはそのようなイベントがないことがPreNotifyInputわかりましたが、同等のものを見つけましたPreviewTextInput

最初に を試してみましたRegExpが、うまくいかず、単純な を使用しましたindexOf

private bool ValidChar(string _char)
{
   string Lista = @" ! "" # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ";
   return Lista.IndexOf(_char.ToUpper()) != -1;
   //System.Text.RegularExpressions.Regex RegVal = new System.Text.RegularExpressions.Regex(@"(?<LETRAS>[A-Z]+)+(?<NUMERO>[0-9]+)+(?<CAR>[!|""|#|$|%|&|'|(|)|*|+|,|\-|.|/|:|;|<|=|>|?|@]+)+");
   //return RegVal.IsMatch(_char);
}

private void textBoxDescripcion_PreviewTextInput(object sender, TextCompositionEventArgs e)
{
    if (!ValidChar(e.Text))
         e.Handled = true;
}
于 2011-09-25T21:12:23.947 に答える
2

慣れるまで少し時間がかかりますが、キー値自体をそのまま使用できます。入力を英数字に制限しようとしていて、少し余分に入力しようとしている場合は、以下のコードが役立つ場合があります。

    private bool bLeftShiftKey = false;
    private bool bRightShiftKey = false;

    private bool IsValidDescriptionKey(Key key)
    {
        //KEYS ALLOWED REGARDLESS OF SHIFT KEY

        //various editing keys
        if (
        key == Key.Back ||
        key == Key.Tab ||
        key == Key.Up ||
        key == Key.Down ||
        key == Key.Left ||
        key == Key.Right ||
        key == Key.Delete ||
        key == Key.Space ||
        key == Key.Home ||
        key == Key.End
        ) {
            return true;
        }

        //letters
        if (key >= Key.A && key <= Key.Z)
        {
            return true;
        }

        //numbers from keypad
        if (key >= Key.NumPad0 && key <= Key.NumPad9)
        {
            return true;
        }

        //hyphen
        if (key == Key.OemMinus)
        {
            return true;
        }

        //KEYS ALLOWED CONDITITIONALLY DEPENDING ON SHIFT KEY

        if (!bLeftShiftKey && !bRightShiftKey)
        {
            //numbers from keyboard
            if (key >= Key.D0 && key <= Key.D9)
            {
                return true;
            }
        }

        return false;
    }

    private void cboDescription_PreviewKeyDown(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.LeftShift)
        {
            bLeftShiftKey = true;
        }

        if (e.Key == Key.RightShift)
        {
            bRightShiftKey = true;
        }

        if (!IsValidDescriptionKey(e.Key))
        {
            e.Handled = true;
        }
    }

    private void cboDescription_PreviewKeyUp(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.LeftShift)
        {
            bLeftShiftKey = false;
        }

        if (e.Key == Key.RightShift)
        {
            bRightShiftKey = false;
        }
    }
于 2009-11-05T19:22:55.093 に答える
0

PreNotifyInput ハンドラー内で、次のようなことを試してください。

if (e.StagingItem.Input is System.Windows.Input.TextCompositionEventArgs)
{
    if (!String.IsNullOrEmpty((e.StagingItem.Input as System.Windows.Input.TextCompositionEventArgs).Text))
    {
        Char c = (e.StagingItem.Input as System.Windows.Input.TextCompositionEventArgs).Text[0];
    }
}

さまざまなルーティング イベントで複数回発生するため、特定のルーティング イベントをフィルター処理することができます。

于 2011-05-03T17:10:03.957 に答える