كيفية ضبط التركيز في إعادة تحميل صفحة WPF؟

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

  •  05-07-2019
  •  | 
  •  

سؤال

لقد حصلت على تطبيق يشبه متصفح WPF مع بضع صفحات. عندما أقوم بالتبديل بين الصفحات ، أود تعيين تركيز لوحة المفاتيح.

عندما يتم تحميل صفحة في المرة الأولى ، يعمل هذا عن طريق الاتصال Control.Focus() في المنشئ.

ولكن عندما أقوم بالتبديل بين الصفحات ، لا يعمل هذا بعد الآن - ينصب التركيز على الحقل الأول فقط ، ويتجاهل محاولاتي لتغييره إلى أي شيء آخر :(

الصفحات لها السمة KeepAlive=true - سيكون الأمر على ما يرام إذا كان ذلك سيبقي التركيز على قيد الحياة أيضًا ، ولكن مجرد التركيز على الحقل الأول أمر مزعج.

حاولت ضبط التركيز في الحدث المحمّل ، لكنه لم ينجح أيضًا. يبدو أن التركيز الافتراضي يتم تعيينه بعد إعادة تحميل الصفحة.

هل هناك أي طريقة لتعيين التركيز على إدخال صفحة في المرة الثانية؟ متى وكيف وأين يجب أن أقوم بتعيين التركيز عند التبديل بين صفحات WPF في تطبيق يشبه المتصفح?

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

المحلول 4

بما أنني لم أجد أي حل لهذه المشكلة ، فقد استخدمت حلًا بسيطًا:

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

لحسن الحظ ، يتم ذلك بسهولة بالغة باستخدام BeginInvoke:

myControl.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Background, 
(System.Threading.SendOrPostCallback)delegate(object state) 
{ 
  myControl.Focus(); 
});

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

نصائح أخرى

حاول إضافة FocusManager.focusedElement = "{{elementName = [...]}" `إلى العنصر الأول في صفحتك وتعيين [...] باسم العنصر الذي يجب أن يحصل على التركيز.

هل حاولت ضبط التركيز في معالج الأحداث المحمّل بدلاً من المُنشئ؟ لا يتم إعادة بناء الصفحات عند العودة إليهم ، لكن يتم إعادة تحميلها إذا كنت أتذكر بشكل صحيح.

بعد وجود "كابوس التركيز الأولي لـ WPF" واستنادًا إلى بعض الإجابات على المكدس ، أثبت ما يلي أنه أفضل حل.

أولاً ، أضف app.xaml onstartup () ما يلي:

EventManager.RegisterClassHandler(typeof(Window), Window.LoadedEvent,
          new RoutedEventHandler(WindowLoaded));

ثم أضف حدث "Windowloaded" أيضًا في app.xaml:

void WindowLoaded(object sender, RoutedEventArgs e)
    {
        var window = e.Source as Window;
        System.Threading.Thread.Sleep(100);
        window.Dispatcher.Invoke(
        new Action(() =>
        {
            window.MoveFocus(new TraversalRequest(FocusNavigationDirection.First));

        }));
    }

يجب استخدام مشكلة الخيوط مع فشل التركيز الأولي لـ WPF بسبب بعض ظروف سباق الإطار.

لقد وجدت الحل التالي أفضل لأنه يستخدم عالميًا للتطبيق بأكمله.

أتمنى أن يساعد ...

أوران

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