2015-11-09 7 views
5

मैं अपने आवेदन नेविगेशन के लिए उदाहरण के रूप में uwp navigation example का उपयोग करता हूं। मुझे टेक्स्टबॉक्स पर ध्यान केंद्रित करने की आवश्यकता है। मैं इसे uwp navigation example पर आज़माएं। बेसिकपेज के लिए मैं यह कोड जोड़ता हूं:यूवीपी नेविगेशन उदाहरण और नियंत्रण पर ध्यान केंद्रित

<StackPanel Orientation="Vertical"> 
     <TextBox x:Name="Test" /> 
     <TextBox x:Name="Test1" /> 
    </StackPanel> 

    public BasicPage() 
    { 
     this.InitializeComponent(); 
     this.Loaded += BasicPage_Loaded; 
    } 

    private void BasicPage_Loaded(object sender, RoutedEventArgs e) 
    { 
     Test1.Focus(FocusState.Programmatic); 
    } 

टेस्ट 1 फोकस प्राप्त नहीं करता है। मैं इस कोड को "सामान्य" विंडोज सार्वभौमिक ऐप में आज़माता हूं - यह काम है। आप क्या सलाह देते हैं?

उत्तर

6

ऐसा इसलिए है क्योंकि टेस्ट 1 को कॉल करने के बाद फ़ोकस फ़ंक्शन को अन्य स्थान पर बुलाया जाता है। फ़ोकस।

AppShell.xaml.cs में, आपको निम्न कोड पा सकते हैं:

private void OnNavigatedToPage(object sender, NavigationEventArgs e) 
{ 
    // After a successful navigation set keyboard focus to the loaded page 
    if (e.Content is Page && e.Content != null) 
    { 
     var control = (Page)e.Content; 
     control.Loaded += Page_Loaded; 
    } 
} 

private void Page_Loaded(object sender, RoutedEventArgs e) 
{ 
    ((Page)sender).Focus(FocusState.Programmatic); 
    ((Page)sender).Loaded -= Page_Loaded; 
    this.CheckTogglePaneButtonSizeChanged(); 
} 

उपरोक्त कोड का मतलब है जब आप एक पृष्ठ पर नेविगेट, यह पृष्ठ लोड घटना सदस्यता लें और पेज पर ध्यान देने के सेट हो जाएगा।

आपका कोड पृष्ठ में पृष्ठ लोड किए गए ईवेंट की सदस्यता लेता है। और आपका कोड AppShell में पेज_लोडेड फ़ंक्शन से पहले निष्पादित किया जाएगा। तो आपको वह नहीं मिला जो आप चाहते हैं।

तो यदि आप पेज_लोडेड फ़ंक्शन में ((Page)sender).Focus(FocusState.Programmatic); पर टिप्पणी करते हैं। आप जो चाहते हैं उसे प्राप्त करेंगे। मुझे यकीन नहीं है कि उस रेखा का सही उद्देश्य क्या है। लेकिन सबकुछ अच्छा लगता है।

यदि आपको उस पंक्ति पर टिप्पणी करने के बाद कुछ गलत लगता है, तो हम इसे भी काम कर सकते हैं। लोड घटना के बाद लेआउट अद्यतन घटना में एक बार फोकस फ़ंक्शन को कॉल करें।

public sealed partial class BasicPage : Page 
{ 
    bool bAfterLoaded = false; 
    public BasicPage() 
    { 
     this.InitializeComponent(); 
     this.Loaded += BasicPage_Loaded; 
     this.LayoutUpdated += BasicPage_LayoutUpdated; 
    } 

    private void BasicPage_LayoutUpdated(object sender, object e) 
    { 
     if (bAfterLoaded) 
     { 
      Test1.Focus(FocusState.Programmatic); 
      bAfterLoaded = !bAfterLoaded; 
     } 
    } 

    private void BasicPage_Loaded(object sender, RoutedEventArgs e) 
    { 
     bAfterLoaded = !bAfterLoaded; 
    } 
} 

आशा है कि यह आपकी मदद कर सके।

+0

धन्यवाद। यह BasicPage_LayoutUpdated के साथ काम करता है। – FetFrumos

0

यदि आप प्रोग्रामिक रूप से टेक्स्टबॉक्स पर ध्यान केंद्रित करना चाहते हैं। कीबोर्ड डिस्प्ले को रोकें ताकि लेआउटअपडेट ईवेंट आग न लगे। आप जैसे कुछ कर सकते हैं तो पेज_लोडेड ईवेंट में test1.Focus (FocusState.Programmatic) करें;

संबंधित मुद्दे