WPF: OnKeyDown () لا يتم استدعاؤه لمفتاح المساحة في التحكم المستمد من صندوق النص WPF

StackOverflow https://stackoverflow.com/questions/1458748

  •  12-09-2019
  •  | 
  •  

سؤال

في تطبيق WPF، لدي عنصر تحكم اشتقته من Textbox مثل هذا:

public class SelectableTextBlock : TextBox
{
    protected override void OnKeyDown(KeyEventArgs e)
    {
        base.OnKeyDown(e);
        e.Handled = false;
    }
}

لا يتم استدعاء طريقة Onkeydown عند إدخال مساحة في مربع النص، ولا عند ضرب المسافة الخلافة، ولكن النار بإدخال آخر بما في ذلك الأحرف القابلة للطباعة العادية (مثل "A") ومفاتيح المعدل (على سبيل المثال).

أنا أستخدم عنصر التحكم هذا مع تعيين isreadonly إلى True حتى أتمكن من عرض نص قابل للتحديد غير قابل للتحديد. التحكم في عنصر التحكم في DataGrid Wpftoolkit، وأريد أحداث Keydown لنشر شبكة البيانات، حتى إذا كان SelectableTextBlock له تركيز، وهذا هو السبب في أنني أستخدم عنصر تحكم مخصص بمناسبة الحدث بشكل صريح كما غير معالج.

المشكلة هي أن الحدث ليس حتى جعله على سيطرتي على مفاتيح معينة. لا يمكنني فقط استخدام OnPreviewkeyDown في DataGrid للحصول على جولة حول هذا، حيث أريد عناصر تحكم أخرى تستخدم في شبكة البيانات لتبتلع حدث Keydown Scrace.

هل يعرف أحد كيف يمكنني الحصول على حدث Keydown لمفتاح الفضاء لنشره؟

شكرا.

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

المحلول 2

يبدو أن المشكلة هي أن حدث مفتاح المساحة (والفترة الخليقة وما إلى ذلك) يتم التعامل مع مفتاح أسفل داخل مربع النص، قبل أن تنبعث منه درجات التحكم المشتقة. أفترض كجزء من عملية تكوين النص، كما نشر WIM.

لتحمل هذا، أضفت معالجا سيحصل على حدث مفتاح أسفل حتى يتم التعامل معها بالفعل، ويعيد العضو الذي تم التعامل معه إلى False، للسماح له بالاستمرار في المخيم بشكل طبيعي. في المثال أدناه، فقط يفعل ذلك فقط لمفاتيح الفضاء، ولكن في حالتي، سأحتاج إلى القيام بذلك لأي أحداث أساسية حقا لا تريد التعامل معها في SeartabletabletBlock، كما لا أعرف الأحداث الرئيسية قد تكون الآباء والأمهات قد تكون مهتمة حتى الآن.

public class SelectableTextBlock : TextBox
{
    public SelectableTextBlock() : base()
    {
        this.AddHandler(SelectableTextBlock.KeyDownEvent, new RoutedEventHandler(HandleHandledKeyDown), true);
    }

    public void HandleHandledKeyDown(object sender, RoutedEventArgs e)
    {
        KeyEventArgs ke = e as KeyEventArgs;
        if (ke.Key == Key.Space)
        {
            ke.Handled = false;
        }
    }
    ...
}

أنا بالطبع لا يزال مهتما إذا كان أي شخص لديه حلا أفضل ...

شكرا، هاء

نصائح أخرى

الحدث PreviewKeyDown موجود بالضبط لهذا النوع من الأشياء.

private void spacebarHandler_PreviewKeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Space)
        e.Handled = true;
}

لن يتلقى معالج Keydown الخاص بك الحدث Keydown ل SpaceBar.

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

هذا ما حصلت عليه كإجابة: (http://social.msdn.microsoft.com/forums/en-us/wpf/Thread/446EC083-04C8-43F2-89DC-1521A31F6B.)

نظرا لأن بعض IMES ستعامل مع ضغط المفاتيح المسافة بيضاء كجزء من عملية تكوين النص، ولهذا السبب تأكل AVALON للإبلاغ عن نص مرفق صحيح من خلال حدث TextInput.

يمكن أن أكون خارج النطاق تماما ولكن قراءة هذا الموضوع emmideately جعلني أفكر في تلك القضية التي تلقيتها مرة واحدة.

تحياتي لطيفة، ويم

استخلاص رأي، قم بتقييد البريد الإلكتروني من مربع النص.

public class RestrictKeysTextBox : TextBox
{
    ....
}

تجاوز حدث OnPreviewKeyDown في مربع RestrictKeystExtex.

ضع المنطق في هذا التجاوز مثل هذا:

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

ربط مثيل RestrictKeystExtBox إلى DataGrid الخاص بك.

يجب أن تعمل ذلك دون تجاوز OnPrepiewKeyDown في DataGrid والقضاء على المشكلات المرتبطة بها.

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