C# 将WPF窗口属性重置为XAML中设置的默认值

C# 将WPF窗口属性重置为XAML中设置的默认值,c#,wpf,C#,Wpf,您可以为WPF中的某些窗口属性设置默认值。例如,您可以在XAML中设置画布的宽度或文本块的文本,然后您的应用程序可以通过访问控件来更改它们。有没有什么方法可以将这些值设置为在XAML中声明它们的方式,而不用自己保存它们?它们是否保存在某个地方,以便您可以在运行时访问它们?我认为WPF无法知道默认值是什么,但您可以创建自己的属性,其中包含有关默认值的信息,并创建将设置该值的方法 首先,我们需要一个属性,该属性将保存有关给定属性默认值的信息: [AttributeUsage(AttributeTar

您可以为WPF中的某些窗口属性设置默认值。例如,您可以在XAML中设置画布的宽度或文本块的文本,然后您的应用程序可以通过访问控件来更改它们。有没有什么方法可以将这些值设置为在XAML中声明它们的方式,而不用自己保存它们?它们是否保存在某个地方,以便您可以在运行时访问它们?

我认为WPF无法知道默认值是什么,但您可以创建自己的属性,其中包含有关默认值的信息,并创建将设置该值的方法

首先,我们需要一个属性,该属性将保存有关给定属性默认值的信息:

[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);
        }
    }
程序的输出为:

开始--0
ApplyDefaults-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}");
    }