为什么 WPF XAML Intellisense 仅显示具有 public 吸气剂的字段?

Why WPF XAML Intellisense shows only fields with public getters?

我想知道为什么我的 Visual Studio 2017 Intellisense 只显示 public getter 的字段。在这种特殊情况下,带有 public getter 的静态字段,因为我试图将一些 static/constant 字段加载到 WPF 内容中。

正如您在下面的代码中看到的,我已将三个不同的字段添加到 App class,但只显示了一个 (StaticGetterName)。有趣的是,如果我在没有任何拼写错误的情况下键入其他两个字段 (StaticFieldConstantName),则它们工作顺利。该项目使用 App class.

中的任何三个字段构建并成功运行

我已经尝试使用其他命名空间,其他 classes,尝试将 static 关键字添加到 class 声明 - 到目前为止没有变化。 partial 关键字也不是问题。

如果我要写一些活页夹,这会很好。仅显示带有 public getter 的建议将非常有意义。但是当涉及到所有类型的静态字段时呢?不会太多。

我看到了其他问题,所以我推断 XAML Intellisense 仍然存在一些错误,但要澄清一下 - 这不是 Intellisense 不工作的情况。它确实有效,在我看来它并没有显示所有可能的自动完成。

App.xaml.cs

namespace DSIK.ClientApp
{
    using System.Windows;

    public partial class App : Application
    {
        public const string ConstantName = "Client";

        public static string StaticField = ConstantName;

        public static string StaticGetterName => ConstantName;
    }
}

MainWindow.xaml

<Window x:Class="DSIK.ClientApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:DSIK.ClientApp"
        Title="{x:Static local:App.StaticGetterName}" Height="460" Width="570">
    <Grid>

    </Grid>
</Window>

我很矮,因为 Xaml 类型系统和模式模型只有属性的概念。没有字段的概念。默认模式上下文本可以将 CLR 字段视为 Xaml 属性,但从未这样做过。我想没有理由这样做,因为 public,.NET 通常不鼓励使用非最终字段。

Xaml类型机型也没有防护等级的概念。这可能是一个深思熟虑的设计决定。可以在 Xaml 标记中声明的所有成员必须是 public。这是有道理的,因为 Xaml(或 Baml)在运行时被解析,并且 Xaml 可以完全存在于项目和程序集的范围之外,因此没有明确和一致的方式来处理 internal 成员,例如。 Xaml 中的对象构造不会发生在构造对象实例的上下文中。换句话说,Xaml 从 外部 构建对象,因此它也不支持 privateprotected 成员。

最后,常量和字段有点不同。即使 public 字段确实映射到 Xaml 属性,也没有理由映射常量,因为它们不可能在 Xaml 中设置。这同样适用于只读字段,就像只读属性(或没有 public setter 的属性)一样。