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

时间:2017-10-30 08:10:13

标签: c# wpf

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

2 个答案:

答案 0 :(得分:0)

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

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

[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);
        }
    }

使用示例程序:

 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}");
    }

该计划的输出是:

  

开始 - - 0
  ApplyDefaults - Noname - 0
  使用二传手后 - 达米安 - 23
  在ApplyDefaults之后 - Noname - 23

我刚检查过.NET有DefaultValue Attribute,您可以用类似的方式使用它。

答案 1 :(得分:0)

  

我的问题是,是否有一个函数或一些hacky方法将所有值设置为wpf api中的某个默认值?

不,没有。

您最好关闭窗口并创建一个新窗口。或者你必须手动&#34;通过编写自己的自定义代码来重置所有值。

如果您想要重置控件属性的值而不在某处指定它,那么框架就不应该知道。指定它的方法是编写代码。