我想知道如何从内部将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()类似的方法?
答案 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?。