none
Zugriff auf die TextBox einer AutoSuggestBox RRS feed

  • Frage

  • Hallo zusammen,

    ich versuche gerade eine Bildschirmtastatur, die ich aus de DigitalSignageUWP Beispielapp entnommen habe, dazu zu verwenden, um Text in eine AutoSuggestBox einzugeben. Mein Problem ist, dass ich dafür die Position des Cursors brauche.

    Bei einer Textbox wird im Beispiel dafür textbox.SelectionStart verwendet. Dieses Property gibt es so bei einer AutoSuggestBox nicht. Allerdings befindet sich ja in der AutoSuggestBox eine TextBox.... Gibt es eine Möglichkeit, auf das Property SelectionStart der internen Textbox zuzugreifen?

    Ich würde mich über eine Antwort freuen!!!

    Viele Grüße

    DSC

    Sonntag, 5. Juni 2016 16:24

Antworten

  • Hallo,

    ich hätte nicht erwartet dass die AutoSuggestBox sealed ist. Da geht meine Idee natürlich nicht.

    Da GetTemplateChild nicht public ist, könnte man da maximal über Reflection ran kommen. Das birgt aber die Probleme, dass es langsamer ist und bei Änderungen ohne Compilerfehler etwas schiefgehen kann. Davon abgesehen könnte das dann in etwa so aussehen:

    private TextBox _textBox;
    private void OnLoaded(object sender, RoutedEventArgs e)
    {
        //Get the type of the control
        var type = typeof(AutoSuggestBox);
    
        //Get Method from Type
        var method = type.GetMethod("GetTemplateChild", BindingFlags.Instance | BindingFlags.NonPublic);
    
        //Call method of the object "Asb" and pass parameter "TextBox" (name of the control to obtain)      
        this._textBox = (TextBox)method.Invoke(this.Asb, new object[] { "TextBox" });
    
        this._textBox.SelectionChanged += this._textBox_SelectionChanged;
    }
    
    private void _textBox_SelectionChanged(object sender, RoutedEventArgs e)
    {
        this.Tb.Text = "SelectionStart = " + this._textBox.SelectionStart;
    }
    
    private void OnSetSelectionStart(object sender, RoutedEventArgs e)
    {
        this._textBox.SelectionStart = 2;
        this._textBox.Focus(FocusState.Pointer);
    }

    Beispielprojekt auf GitHub: UWP AutoSuggestBox set SelectionStart

    Man könnte die "neue Control-Logik" natürlich noch in einem eigenen Control kapseln welches die AutoSuggestBox einfach als Kind enthält.

    Sonderlich schön finde ich es nicht hier Reflection einzusetzen, aber eine andere Möglichkeit sehe ich leider auch nicht.


    Tom Lambert - .NET (C#) MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets


    Dienstag, 7. Juni 2016 01:52

Alle Antworten

  • Hallo,

    sofern im Template der AutoSuggestBox eine TextBox enthalten ist, kommst du über einen Umweg dort ran. Hierfür musst du eine eigene Klasse von AutoSuggestBox ableiten und das Template der Basisklasse in die Generic.xaml packen. (Einen Rahmen für die zu erstellende Klasse und das Template bietet die Vorlage "Benutzerdefiniertes Control".)

    In der Generic.xaml, im Template musst du nun der TextBox einen Namen geben. Dann kannst du innerhalb der Klasse in der OnApplyTemplate-Methode das Control "abrufen":

    TextBox tb;
    
    protected override void OnApplyTemplate()
    {
        base.OnApplyTemplate();
        this.tb = (TextBox) this.GetTemplateChild("TextBoxName");
    }
    Nun brauchst du bloß noch eine Eigenschaft für SelectionStart implementieren, die den Wert entsprechend an die TextBox weiter gibt.


    Tom Lambert - .NET (C#) MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Sonntag, 5. Juni 2016 18:47
  • Hallo,

    ich habe noch nicht so viel Erfahrung mit C#, daher eine vielleicht etwas dumme Frage dazu:

    Die Klasse AutoSuggestBox ist "sealed". Das verstehe ich so, dass man nicht von ihr ableiten kann.

    Ist das korrekt? Und falls ja, wie kann ich dann die OnApplyTemplate() methode für die AutoSuggestBox abrufen? So wie ich das sehe hat die vorhandene TextBox im Template bereits einen Namen, hier muss ich also glaube ich nichts überschreiben...

    Ich würde mich über Hilfreiche Ratschläge freuen!

    Viele Grüße!!!


    • Bearbeitet DSC91 Montag, 6. Juni 2016 19:02
    Montag, 6. Juni 2016 18:46
  • Hallo,

    ich hätte nicht erwartet dass die AutoSuggestBox sealed ist. Da geht meine Idee natürlich nicht.

    Da GetTemplateChild nicht public ist, könnte man da maximal über Reflection ran kommen. Das birgt aber die Probleme, dass es langsamer ist und bei Änderungen ohne Compilerfehler etwas schiefgehen kann. Davon abgesehen könnte das dann in etwa so aussehen:

    private TextBox _textBox;
    private void OnLoaded(object sender, RoutedEventArgs e)
    {
        //Get the type of the control
        var type = typeof(AutoSuggestBox);
    
        //Get Method from Type
        var method = type.GetMethod("GetTemplateChild", BindingFlags.Instance | BindingFlags.NonPublic);
    
        //Call method of the object "Asb" and pass parameter "TextBox" (name of the control to obtain)      
        this._textBox = (TextBox)method.Invoke(this.Asb, new object[] { "TextBox" });
    
        this._textBox.SelectionChanged += this._textBox_SelectionChanged;
    }
    
    private void _textBox_SelectionChanged(object sender, RoutedEventArgs e)
    {
        this.Tb.Text = "SelectionStart = " + this._textBox.SelectionStart;
    }
    
    private void OnSetSelectionStart(object sender, RoutedEventArgs e)
    {
        this._textBox.SelectionStart = 2;
        this._textBox.Focus(FocusState.Pointer);
    }

    Beispielprojekt auf GitHub: UWP AutoSuggestBox set SelectionStart

    Man könnte die "neue Control-Logik" natürlich noch in einem eigenen Control kapseln welches die AutoSuggestBox einfach als Kind enthält.

    Sonderlich schön finde ich es nicht hier Reflection einzusetzen, aber eine andere Möglichkeit sehe ich leider auch nicht.


    Tom Lambert - .NET (C#) MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets


    Dienstag, 7. Juni 2016 01:52
  • Super, das ist die Lösung!

    Vielen Dank für die Hilfe!!!

    Dienstag, 7. Juni 2016 17:45