2017-04-26 71 views
0

我不知道我怎样才能重新加载用户控件到它的内部,从原始模板,刷新,重绘,或刷新用户控件(UWP)

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

没有任何this.reCreate()类似的方法?

回答

0

我的回答基于一个answer针对Windows Forms 8+发布。

我已经通过,并且每个元件的清晰值时使用相同的逻辑从答案和创建的扩展方法在Root网格到环路(模仿它使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(); 

而且正如在其他答复中提到,如果要清除只有特定的控件,您可以使用

rootGrid.Children.ClearControls<TextBox>(); 

您可以找到扩展类我Gist

祝你好运。

+0

感谢您的建议,不幸的是,这不能应用于动态自定义usercontrols,一些控件有自己的数据,我正在寻找的方法应该像创建一个自定义用户控件的新实例,或要求父母删除它,然后添加一个具有相同名称的新的。 – Mhood

0

如果您的意思是清除用户在各个字段中输入的值,那么使用MVVM会使其非常简单 - 您可以用新的视图模型替换视图模型,并且绑定会更新所有内容。您也可以在视图模型中使用Clear方法。

如果你的意思是修复可能已经改变了原始视觉树的拓扑结构 - 最好的办法是用新的替换你的控制。

也值得注意 - “模板”通常不是与用户控件关联的单词。用户控件在XAML中定义其可视化树,每次创建控件时都会加载它。模板化控件使用通常加载一次并在加载时应用于每个控件的模板。有关更多可能有用的信息,请参阅When to use a templated control over a UserControl?

+0

我正在考虑用新的替换我的UserControl,或者从它的父节点中删除这个控件,然后用相同的名称重新创建它。 问题只是创建“取消”按钮,我不想循环控制并清空它们,一些控件已经是自定义的用户控件。 – Mhood

+0

您应该使用MVVM,然后您的数据对象可以很容易地被替换为一个新的空的。 –