无法浏览到 WPF/.net Core 应用程序的设置设计器中的特定类型

sti*_*ler 5 wpf settings visual-studio .net-core

当我以前使用设置设计器时,我可以通过“类型”下下拉列表底部的“浏览”按钮浏览查找要在我的设置中使用的非标准类型(例如不常见的枚举等) “ 柱子。我正在为 .net Core 开发一个 WPF 桌面应用程序,但没有浏览选项,如下图所示:

在此输入图像描述

我确实进入了 ( ) 后面的代码Settings.Designer.cs.并手动编辑代码,但在保存时,这只是恢复为字符串。我猜这可能与 App.config 中也有一个元素的设置有关,我注意到它有一个“serialiseAs”标签 - 不知道放在这里是什么。设置和 App.config 背后的代码示例:

[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("")]
public string UiTheme {
    get {
        return ((string)(this["UiTheme"]));
    }
    set {
        this["UiTheme"] = value;
    }
}
Run Code Online (Sandbox Code Playgroud)
<userSettings>
    <GameBoxer.WPF.Properties.Settings>
        <setting name="UiTheme" serializeAs="String">
            <value />
        </setting>
    </GameBoxer.WPF.Properties.Settings>
</userSettings>
Run Code Online (Sandbox Code Playgroud)

有谁知道如何恢复“浏览”?或者,如何在代码中正确地做到这一点?

我正在使用 Visual Studio 2022 社区

谢谢


更新:所以,我了解到这是根据 MS 的 VS2022中的“设计” 。它在 VS2019 中仍然存在!但他们已经把它从 VS2022 中删除了,我不知道如何在代码中做到这一点。MS,你是我最喜欢的人之一,但有时,你就像一盒青蛙一样生气。不幸的是,除了“这不是一个错误”之外,该链接没有为发布者提供任何其他选择。真的不是很有帮助。

Dea*_*man 0

正如您提供的链接中提到的,此更改是由于 .NET Core 而设计的,虽然我非常不同意他们对此的立场 - 我假设这样做是因为让您自己的类型工作可能非常繁琐正如预期的那样,特别是对于新用户。

如果您的自定义数据有多个值,则一种简单的string解决方法是使用;. 您也可以使用它StringCollection来达到相同的结果。

不方便,是的。但这仍然是一个简单的解决方案。

我真诚地希望微软改变他们对此的立场,并考虑重新实现它,因为一旦你弄清楚了让它正确序列化的过程,它就会工作得非常好。

编辑:

我想我不妨举个例子;

// Storing the Settings
// Parameter: Struct { Location(Point), Size(Point), Margin(Thickness) }
var settingString = $"{e.Location.X};{e.Location.Y};{e.Size.X};{e.Size.Y};{e.Margin.Left};{e.Margin.Top};{e.Margin.Right};{e.Margin.Bottom}";
Properties.Settings.Default.MySetting = settingString;
Properties.Settings.Default.Save();

// Parsing the Saved Setting
var settingString = Properties.Settings.Default.MySetting;
if (!String.IsNullOrWhiteSpace(settingString))
{
    List<string> splitStrings = settingString.Split(';', StringSplitOptions.RemoveEmptyEntries).ToList();
    List<double> parsedValues = new List<double>();
    splitStrings.ForEach(x => parsedValues.Add(double.Parse(x)));

    var location = new Point(parsedValues[0], parsedValues[1]);
    var size = new Point(parsedValues[2], parsedValues[3]);
    var margin = new Thickness(parsedValues[4], parsedValues[5], parsedValues[6], parsedValues[7]);
}
Run Code Online (Sandbox Code Playgroud)

可能有更好的方法来做到这一点,但我发现这是一个非常简单的解决方法,并且到目前为止效果很好。