【发布时间】:2017-04-26 14:44:43
【问题描述】:
我想知道如何从内部将 UserControl 重新加载到它的原始模板中,
<UserControl x:Name="_UserControl">
<!-- other input controls and combos -->
<Button OnClick="Reload_UserControl"/>
</UserControl>
有没有类似this.reCreate()的方法?
【问题讨论】:
我想知道如何从内部将 UserControl 重新加载到它的原始模板中,
<UserControl x:Name="_UserControl">
<!-- other input controls and combos -->
<Button OnClick="Reload_UserControl"/>
</UserControl>
有没有类似this.reCreate()的方法?
【问题讨论】:
我的答案基于 8 多年前为 Windows 窗体发布的 answer。
我使用了与该答案相同的逻辑,并在 Root Grid 上创建了扩展方法来循环并清除每个元素的值(模仿它以将 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找到扩展类
祝你好运。
【讨论】:
如果您的意思是清除用户在各个字段中输入的值,那么使用 MVVM 会变得非常简单 - 您可以用新的视图模型替换视图模型,绑定会更新所有内容。你也可以在视图模型中有一个Clear 方法。
如果您的意思是修复可视化树的拓扑结构,该拓扑结构可能已从原始版本中更改 - 您最好的办法是用新控件替换您的控件。
另外值得注意的是——“模板”通常不是与用户控件相关的词。用户控件在 XAML 中定义其可视树,每次创建控件时都会加载该树。模板化控件使用通常加载一次并在加载时应用于每个控件的模板。请参阅When to use a templated control over a UserControl? 了解更多可能有用的信息。
【讨论】: