سؤال

وأنا بحاجة للحصول على وسائط الحدث بأنه char، ولكن عندما أحاول صب التعداد مفتاح أحصل على الحروف والرموز مختلفة تماما عن ما صدر في.

وكيف صحيح تحويل مفتاح شار؟

وهذا ما حاولت

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

وتحرير: أنا أيضا لا يوجد لديك خاصية الرمز الرئيسي على وسائط. أنا الحصول عليها من الحدث InputManager.Current.PreNotifyInput.

هل كانت مفيدة؟

المحلول

نصائح أخرى

ويستغرق قليلا تعتاد، ولكن يمكنك فقط استخدام القيم الأساسية نفسها. إذا كنت تحاول للحد من المدخلات إلى أبجدية رقمية وربما قليلا اضافية، رمز أدناه قد تساعد.

    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;
        }
    }

وهذا العمل بالنسبة لي:

واستنادا إلى البند الأخير وجدت أن في 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;
}

وأعرف أن هذا هو القديم، ولكن أيا من الإجابات يبدو أن الإجابة في الواقع هذا السؤال. السبب شار مختلفة يعود هو لأنه عندما كنت مجرد محاولة تحويل ذلك إلى char كنت صب قيمة التعداد إلى "شار". ولكن:

var keyPressed = e.key.ToString();

وتعمل كبرى. إرجاع مفتاح ضغط كسلسلة. ثم قمت بالتدقيق في الطول. اذا كان == 1 ثم انها شار أو رقم أو رمز. إذا كان أكبر من 1 انها مفتاح خاص.

إذا كنت ترغب فقط شار ثم يمكنك القيام keyPressed[0];

وهذا هو كيف أفعل ذلك.

private void scrollViewer_KeyDown(object sender, KeyEventArgs e)
{
    if (!e.IsRepeat)
    {
        var keyPressed = e.Key.ToString();
        if(keyPressed.Length == 1)
            CharKeyPressed(keyPressed[0]);
        else if(keyPressed.Length > 1)
            HandleSpecialKey(keyPressed)
    }
}

وداخل معالج 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];
            }
        }

وهذا يثير عدة مرات للأحداث الموجهة مختلفة، لذلك قد ترغب في تصفية واحد بعينه.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top