2017-04-26 67 views
0

私は私がそれにユーザーコントロールをリロードすることができますが、内側からオリジナルテンプレートのか疑問、更新、再描画、またはリロードユーザーコントロール(UWP)

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

は、任意のthis.reCreate()と同様の方法がありますか?

答えて

0

私の回答は、Windowsフォーム8年以上前に投稿されたanswerに基づいています。以下

私はその答えと同じロジックを使用し、各要素の値を介して、透明なループにルートグリッドに拡張メソッドを作成した(バックその通常の状態にUserControlをもたらすために、それを模倣)

であります拡張メソッド。

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); 
      } 
     } 
    } 
} 

使用するには、RootGridに名前を付けます。たとえば、rootGridと言ってください。だから、あなたが呼び出す必要があるすべては、他の回答で述べたように、あなたが唯一の特定のコントロールをクリアしたい場合は、あなたが

rootGrid.Children.ClearControls<TextBox>(); 

を使用することができます。また

rootGrid.Children.ClearControls(); 

であるあなたは私のGist

に拡張クラスを見つけることができます

幸運。

+0

あなたの提案をありがとう、残念ながら、これは動的なカスタムusercontrolsに適用することはできません、いくつかのコントロールは独自のデータを持って、私が探しているメソッドは、カスタムusercontrolの新しいインスタンスを作成するか、それを削除して、同じ名前の新しいものを追加します。 – Mhood

0

MVVMを使用すると、さまざまなフィールドでユーザーが入力した値をクリアすることができれば、ビューモデルを新しいものに置き換えることができ、バインディングによってすべてが更新されます。また、ビューモデルでClearメソッドを使用することもできます。

オリジナルのものから変更されている可能性のあるビジュアルツリーのトポロジを修正している場合は、新しいコントロールで置き換えることをお勧めします。

「テンプレート」は、通常、ユーザーコントロールに関連付けられた単語ではありません。ユーザーコントロールは、コントロールが作成されるたびに読み込まれるXAMLでビジュアルツリーを定義します。テンプレートコントロールは、通常は一度読み込まれ、読み込まれるときに各コントロールに適用されるテンプレートを使用します。潜在的に有用な情報については、When to use a templated control over a UserControl?を参照してください。

+0

私は自分のUserControlを新しいものに置き換えることを考えています。あるいは、このコントロールを親から削除し、同じ名前で再度作成します。 問題はちょうど "キャンセル"ボタンを作成することです、私はコントロールの上にループし、それらを空にしたくない、いくつかのコントロールはすでにカスタムのusercontrolsです。 – Mhood

+0

MVVMを使用する必要があり、データオブジェクトを新しい空のものに簡単に置き換えることができます。 –

関連する問題