为什么 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
)。有趣的是,如果我在没有任何拼写错误的情况下键入其他两个字段 (StaticField
和 ConstantName
),则它们工作顺利。该项目使用 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 从 外部 构建对象,因此它也不支持 private
或 protected
成员。
最后,常量和字段有点不同。即使 public 字段确实映射到 Xaml 属性,也没有理由映射常量,因为它们不可能在 Xaml 中设置。这同样适用于只读字段,就像只读属性(或没有 public setter 的属性)一样。
我想知道为什么我的 Visual Studio 2017 Intellisense 只显示 public getter 的字段。在这种特殊情况下,带有 public getter 的静态字段,因为我试图将一些 static/constant 字段加载到 WPF 内容中。
正如您在下面的代码中看到的,我已将三个不同的字段添加到 App
class,但只显示了一个 (StaticGetterName
)。有趣的是,如果我在没有任何拼写错误的情况下键入其他两个字段 (StaticField
和 ConstantName
),则它们工作顺利。该项目使用 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 从 外部 构建对象,因此它也不支持 private
或 protected
成员。
最后,常量和字段有点不同。即使 public 字段确实映射到 Xaml 属性,也没有理由映射常量,因为它们不可能在 Xaml 中设置。这同样适用于只读字段,就像只读属性(或没有 public setter 的属性)一样。