刷新,重绘或重新加载UserControl(UWP)

时间:2017-04-26 14:44:44

标签: c# uwp uwp-xaml

我想知道如何从内部将UserControl重新加载到它的原始模板

cpp.cumsumgrp = cppFunction('
NumericVector cumsumgrp(NumericVector x, int resetMax) {
int n = x.size();
NumericVector tmp(n);
NumericVector res(n);
tmp[0]=0;
long groupCount=0;
for(int i=1;i<n;i++){
    long csum=tmp[i-1]+x[i];
    if(csum > resetMax) {
      groupCount++;
    }
    tmp[i] = csum > resetMax ? 0 : csum;
    res[i] = groupCount;

}
return(res);
}');

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

2 个答案:

答案 0 :(得分:0)

我的回答是基于Windows Forms 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();

另外如其他答案所述,如果您只想清除特定控件,可以使用

rootGrid.Children.ClearControls<TextBox>();

您可以在我的Gist

上找到扩展程序类

祝你好运。

答案 1 :(得分:0)

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

如果你的意思是修复可能已经从原版改变的可视树的拓扑结构 - 你最好的选择是用新的替换你的控件。

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