【问题标题】:How do I mark a control as 'Private' in WPF?如何在 WPF 中将控件标记为“私有”?
【发布时间】:2015-06-14 01:54:05
【问题描述】:

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

在使用 WPF 时仍然非常绿色,我在 WPF 中看不到明显的等效项,它允许我制作它,因此外部类看不到我拖放到表单或其他用户控件上的控件或其他控件。我确实注意到 x:FieldModifier = "Private" 但我收到错误 "x:FieldModifier = "Private" 对语言 C# 无效"。

如何将控件标记为私有,使其不能被外部类对象查看或访问?

【问题讨论】:

  • 使用 NonPublic 代替 Private。请参阅 MSDN 上的 x:FieldModifier Directive
  • 当然-.-;谢谢你...
  • 没问题。 :) 我正在写一个关于 x:ClassModifier 的答案,然后我重新阅读了你的问题,并意识到这不是你要问的。
  • 阅读您提供的链接帮助我了解 NotPublic 的 C# 等效项是内部的 - 仍然不是我正在寻找的......也许 WPF 不可能?那没有意义,而且会很烦人……
  • 呃 - 不,谢谢;这不是什么重要的事情,我想采取那种方法来处理它......

标签: c# wpf private


【解决方案1】:

TL;DR

在 WPF 中,大多数情况下您无需担心这一点。然而:

  • 如果您使用 x:Name 属性命名 XAML 元素,则可以使用 x:FieldModifier 属性来控制自动生成的表示字段的可见性那个元素。此属性值是特定于语言和大小写的。
  • 如果您不命名 XAML 元素,请不要使用 x:FieldModifier 属性。

继续阅读以获得更详细的说明。


显式命名和生成的字段

如果您在 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,特别是如果您使用模型-视图-视图模型 (MVVM) 模式,您将很少需要在 XAML 中显式命名您的元素,因此默认行为会很好。但是,如果您确实发现需要命名 XAML 元素,并且希望“隐藏”这些元素,则可以使用 x:FieldModifier 属性将元素的可见性设置为 @ 987654331@ 而不是默认的internal。用于属性的值取决于语言且区分大小写,例如。对于 C#:

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

【讨论】:

  • 很好的综合答案。可以通过将 x:FieldModifier="private" 移到开头来改进它,因为那是实际的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-22
  • 2016-01-19
  • 1970-01-01
  • 2010-11-13
  • 2019-05-06
  • 2016-10-17
  • 1970-01-01
相关资源
最近更新 更多