C# 将WPF窗口属性重置为XAML中设置的默认值
您可以为WPF中的某些窗口属性设置默认值。例如,您可以在XAML中设置画布的宽度或文本块的文本,然后您的应用程序可以通过访问控件来更改它们。有没有什么方法可以将这些值设置为在XAML中声明它们的方式,而不用自己保存它们?它们是否保存在某个地方,以便您可以在运行时访问它们?我认为WPF无法知道默认值是什么,但您可以创建自己的属性,其中包含有关默认值的信息,并创建将设置该值的方法 首先,我们需要一个属性,该属性将保存有关给定属性默认值的信息:C# 将WPF窗口属性重置为XAML中设置的默认值,c#,wpf,C#,Wpf,您可以为WPF中的某些窗口属性设置默认值。例如,您可以在XAML中设置画布的宽度或文本块的文本,然后您的应用程序可以通过访问控件来更改它们。有没有什么方法可以将这些值设置为在XAML中声明它们的方式,而不用自己保存它们?它们是否保存在某个地方,以便您可以在运行时访问它们?我认为WPF无法知道默认值是什么,但您可以创建自己的属性,其中包含有关默认值的信息,并创建将设置该值的方法 首先,我们需要一个属性,该属性将保存有关给定属性默认值的信息: [AttributeUsage(AttributeTar
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]
class DefaultAttribute : Attribute
{
public object Value;
public DefaultAttribute(object value)
{
this.Value = value;
}
}
给定此属性,我们可以轻松地声明属性的默认值,如下所示:
class ViewModel
{
[Default("Noname")]
public string Name { get; set; }
public int Age { get; set; }
}
然后,如果要将默认值应用于视图模型,则需要某种方法:
private static void ApplyDefaults(object model)
{
PropertyInfo[] properties = model.GetType().GetProperties();
foreach (var property in properties)
{
DefaultAttribute defaultAttr = property.GetCustomAttribute<DefaultAttribute>();
if (defaultAttr != null)
property.SetValue(model, defaultAttr.Value);
}
}
程序的输出为:
开始--0ApplyDefaults-Noname-0
使用setters-Damian-23后
ApplyDefaults之后-Noname-23 我刚刚检查了.NET,您可以用类似的方式使用它 我的问题是,在WPFAPI中是否有一个函数或某种黑客方式将所有值设置为默认值 不,没有 您最好关闭窗口并创建一个新窗口。或者,您必须通过编写自己的自定义代码来“手动”重置所有值
如果不在某个地方指定控件属性,框架就不能知道何时要重置控件属性的值。指定它的方法是编写代码。隐藏窗口如何节省内存?您不需要它。只需绑定到新的DTO/ViewModel。WPF(和Windows窗体)应用程序使用数据绑定来修改UI控件,而不是直接操纵控件。创建一个类来保存所有数据,并将不同的控件绑定到不同的属性。如果您想一次更改整个表单,只需替换原始实例并引发INotifyPropertyChanged事件,这就是MVVM中V和VM的含义。V是表单,VM是包含此表单数据的类实例。您只需将该实例设置为整个表单的
数据源
,并将各个控件属性绑定到该实例。您可以将同一个实例用于多个不同的表单,甚至不同的面板,例如股票报价列表在一个视图中显示为网格,在一个视图中显示为图表another@Hintham我的windows在创建时执行相当繁重的代码,这会分配大量内存,但只需要执行一次。我可以在代码内部进行检查,但这也可以。@ALazyDoe然后您的窗口正在尝试执行服务或其他类型的后端代码的工作。如果没有代码,就无法提供更多帮助,但是视图除了显示数据之外,还必须执行其他操作。您也可以通过清理代码来避免分配,例如避免临时字符串或避免加载超出实际需要的数据。
public static void Main()
{
var vm = new ViewModel();
Console.WriteLine($"Start - {vm}");
ApplyDefaults(vm);
Console.WriteLine($"ApplyDefaults - {vm}");
vm.Name = "Damian";
vm.Age = 23;
Console.WriteLine($"After using setters - {vm}");
ApplyDefaults(vm);
Console.WriteLine($"After ApplyDefaults - {vm}");
}