2017-04-26 1 views
0

Ich frage mich, wie kann ich nachladen das Usercontrol, um es von innen Originalvorlage ist,Refresh, nachzeichnen oder Reload Usercontrol (UWP)

<UserControl x:Name="_UserControl"> 
<!-- other input controls and combos --> 
<Button OnClick="Reload_UserControl"/> 
</UserControl> 

gibt es eine this.reCreate() ähnliches Verfahren?

Antwort

0

Meine Antwort basiert auf einem answer für Windows Forms 8+ Jahre zurück geschrieben.

I die gleiche Logik aus dieser Antwort und erzeugt Erweiterungsmethode auf dem Root-Grid eine Schleife durch und klare Werte jedes Elements verwendet (es Imitieren die UserControl wieder in seinen normalen Zustand zu bringen)

Unten ist die Erweiterungsmethode

public static class Extensions 
{ 
    private static Dictionary<Type, Action<UIElement>> controldefaults = new Dictionary<Type, Action<UIElement>>() 
    { 
     {typeof(TextBox), c => ((TextBox)c).Text = String.Empty}, 
     {typeof(CheckBox), c => ((CheckBox)c).IsChecked = false}, 
     {typeof(ComboBox), c => ((ComboBox)c).SelectedIndex = 0}, 
     {typeof(ListBox), c => ((ListBox)c).Items.Clear()}, 
     {typeof(RadioButton), c => ((RadioButton)c).IsChecked = false}, 
    }; 

    private static void FindAndInvoke(Type type, UIElement control) 
    { 
     if (controldefaults.ContainsKey(type)) 
     { 
      controldefaults[type].Invoke(control); 
     } 
    } 

    public static void ClearControls(this UIElementCollection controls) 
    { 
     foreach (UIElement control in controls) 
     { 
      FindAndInvoke(control.GetType(), control); 
     } 
    } 

    public static void ClearControls<T>(this UIElementCollection controls) where T : class 
    { 
     if (!controldefaults.ContainsKey(typeof(T))) return; 

     foreach (UIElement control in controls) 
     { 
      if (control.GetType().Equals(typeof(T))) 
      { 
       FindAndInvoke(typeof(T), control); 
      } 
     } 
    } 
} 

Für die Verwendung geben Sie dem RootGrid einen Namen. Sagen Sie rootGrid. Also alles, was Sie rufen müssen, ist

rootGrid.Children.ClearControls(); 

Auch in anderen Antwort erwähnt Wie, wenn Sie bestimmte Steuerelemente löschen möchten, können Sie

rootGrid.Children.ClearControls<TextBox>(); 

verwenden können Sie die Extensions-Klasse finden auf meinem Gist

Viel Glück.

+0

Vielen Dank für Ihren Vorschlag, leider kann dies nicht auf eine dynamische benutzerdefinierte Benutzersteuerelemente angewendet werden, einige Steuerelemente haben ihre eigenen Daten, die Methode, die ich suche, sollte wie eine neue Instanz der benutzerdefinierten Benutzersteuerung erstellen oder die Eltern fragen um es zu entfernen, füge ein neues mit demselben Namen hinzu. – Mhood

0

Wenn Sie die von einem Benutzer in verschiedenen Feldern eingegebenen Werte löschen möchten, ist die Verwendung von MVVM ziemlich einfach - Sie können entweder das Ansichtsmodell durch ein neues ersetzen und die Bindungen würden alles aktualisieren. Sie könnten auch eine Clear Methode im View-Modell haben.

Wenn Sie meinen, dass Sie die Topologie des visuellen Baums korrigieren, die möglicherweise vom Original geändert wurde - Ihre beste Wette wäre, Ihre Kontrolle durch eine neue zu ersetzen.

Auch erwähnenswert - "Vorlage" ist in der Regel kein Wort mit Benutzersteuerelementen verbunden. Benutzersteuerelemente definieren ihre visuelle Struktur in XAML, die jedes Mal geladen wird, wenn das Steuerelement erstellt wird. Vorlagenbasierte Steuerelemente verwenden eine Vorlage, die normalerweise einmal geladen und beim Laden auf jedes Steuerelement angewendet wird. Weitere hilfreiche Informationen finden Sie unter When to use a templated control over a UserControl?.

+0

Ich erwäge, mein Benutzersteuerelement durch ein neues zu ersetzen, oder entfernen Sie dieses Steuerelement von seinem Elternelement, und erstellen Sie es erneut mit demselben Name neu. Das Problem ist nur, um die Schaltfläche "Abbrechen" zu erstellen, ich möchte nicht über die Steuerelemente Schleife und leere sie, einige Steuerelemente sind bereits benutzerdefinierte Benutzersteuerelemente. – Mhood

+0

Sie sollten MVVM verwenden und dann könnte Ihr Datenobjekt leicht durch ein neues leeres ersetzt werden. –

Verwandte Themen