c# - 如何在 WPF 中将控件标记为 'Private'?

标签 c# wpf private

对于 WinForms 程序,我已经习惯于将控件的 Modifiers 属性标记为“私有(private)”,以防止外部类和您拥有的任何其他东西能够看到和弄乱它们。

WPF 仍然非常新,我在 WPF 中看不到明显的等价物,它允许我制作它,因此外部类无法看到我放在窗体或其他用户控件上的控件或其他控件。我确实注意到 x:FieldModifier = "Private",但我收到错误消息“x:FieldModifier = “Private”对 C# 语言无效”。

如何将控件标记为私有(private),使其无法被外部类对象查看或访问?

最佳答案

TL;DR

Most of the time you don't need to worry about this in WPF. However:

  • If you name a XAML element using the x:Name attribute, then you can use the x:FieldModifier attribute to control the visibility of the auto-generated field representing that element. This attribute value is language- and case-specific.
  • If you don't name a XAML element, then don't bother using the x:FieldModifier attribute.

Read on for a more detailed explanation.


显式命名和生成字段

如果您在 Visual Studio 中创建一个新的 WPF 应用程序项目,它将创建一个 MainWindow 类,其 XAML 如下所示:

<Window x:Class="StackOverflow.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
    <Grid>

    </Grid>
</Window>

如果您查看此窗口的代码隐藏类,它将如下所示:

// Several using statements...

namespace StackOverflow
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
    }
}

请注意使用 partial 关键字将其表示为分部类。如果您使用 Windows 资源管理器导航到项目的 obj\Debug 文件夹,您将找到一个名为 MainWindow.g.cs 的文件:该文件包含由XAML 中的 IDE(它基本上等同于 WinForms 中的 *.Designer.cs 文件)。

您的窗口上有一个Grid,但请注意它并没有直接出现在MainWindow 代码的任何地方。现在编辑 XAML 为 Grid 命名:

<Grid x:Name="_myGrid">

编译应用程序,然后再次打开 MainWindow.g.cs 文件。您将看到已添加以下行:

internal System.Windows.Controls.Grid _myGrid;

在 XAML 中设置元素的 x:Name 属性导致代码生成器添加具有该名称的字段。该字段被标记为 internal,这意味着它可供您项目中的所有类型访问,但不能供引用您项目的任何其他项目访问。

所以基本上,如果您没有使用 x:Name 属性在 XAML 中显式命名元素,代码生成器将不会为代码隐藏类中的元素创建命名字段,并且您的元素实际上将是 private(这意味着该类本身也不能直接访问该元素)。


仍然可以通过代码访问无名 UI 元素(如果您有实例)

通过“遍历”Window 实例的可视化树,仍然可以通过代码访问没有名称的元素。例如,因为窗口的内容设置为单个 Grid 元素,您可以通过如下代码访问该网格:

Grid grid = (Grid) this.Content;

this 这里指的是MainWindow类实例。

WinForms 在这方面与 WPF 有着完全相同的“问题”:即使是没有显式命名的控件仍然可以通过代码访问。想象一个带有单个 Button 控件的 WinForms Form。您可以像这样访问该按钮:

Button button = (Button) this.Controls[0];

按钮的默认 Modifiers 值为“Private”这一事实并没有阻止代码访问它。


FieldModifier 属性控制生成的字段可见性

回到 WPF,特别是如果您使用模型- View - View 模型 (MVVM) 模式,您将很少需要在 XAML 中显式命名您的元素,因此默认行为就可以了。但是,如果您确实发现需要命名 XAML 元素,并且希望“隐藏”这些元素,则可以使用 x:FieldModifier 属性将元素的可见性设置为 private 而不是默认的 internal。用于该属性的值取决于语言并且区分大小写,例如。对于 C#:

<Grid x:Name="_myGrid" x:FieldModifier="private">

关于c# - 如何在 WPF 中将控件标记为 'Private'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29525968/

相关文章:

c# - 为什么私有(private)虚拟方法在 C# 中是非法的?

javascript - 如何使用 JSDoc Typescript 声明隐藏 'private' 方法?

java - 私有(private)变量是否与私有(private)类中的包/默认/无修饰符变量具有相同的访问权限?

c# - 在 C# 中将浮点值格式化为百分比不起作用

c# - 关于 C# 中的原始数据类型

c# - 我的 IEquatable 仍在为 Dictionary<T>[] 使用 Object.GetHashcode

wpf - 按钮悬停效果和触摸 (WPF)

WPF - 部署问题 - 错误模块名称 : KERNELBASE. dll

c# - 如何识别在 ListBox 中双击了哪个元素?

c# - 如何安全地保存 x509 证书?