2

我有一个用户控件,我已将其设置为内部:

UserControl x:Class="ClassName"
             x:ClassModifier="internal"

它是匹配的 .cs 文件:

 internal partial class ClassName : UserControl
    {
        public ClassName()
        {
            InitializeComponent();
        }
    }

现在,当我尝试在窗口上使用控件时,如下所示:

 uControls:ClassName x:Name="instanceName" Margin="0,0,8,0" Height="60" VerticalAlignment="Top" Width="60" HorizontalAlignment="Right" MouseLeftButtonUp="instanceName_MouseLeftButtonUp" Cursor="ScrollNW" 

我收到一条错误消息:

The type 'ClassName' cannot have a Name attribute. Value types and types without a default constructor can be used as items within a ResourceDictionary. Line 12 Position 44.

如果我将访问修饰符更改为公共,则一切都按预期工作。

为什么我不能有内部用户控制?

4

2 回答 2

3

我相信这是由 WPF 的编译模型引起的。我从内存中引用它并且找不到资源来备份它,但我相信 WPF 编译发生在两次传递中:基本上“代码隐藏”部分首先编译为中间程序集,然后 XAML 编译为引用该中间体,并将结果合并到最终组装中。

因此,必须公开声明 XAML 引用的类/成员,因为(就编译器而言)它们位于 XAML 的单独程序集中。

编辑:在此处找到了概述该过程的 Microsoft 参考资料。特别是,在支持我上面所说的方面,它说:

如果项目中的一个或多个 XAML 文件引用了本地定义的类型,则会生成一个临时 .dll 文件,以便在第二遍标记编译完成后创建最终的应用程序程序集。

于 2012-11-06T14:12:12.017 回答
2

例如,我知道 XAML 中使用的资源必须是公共的,即使在同一个程序集中也是如此。我相信那是因为他正在使用反射并且只考虑公共的东西,但我对内部实现有点猜测。

我知道我在公共/内部访问修饰符方面还有其他问题,但我现在不记得了。

您可能会遇到有关 UserControl 名称属性的相同限制。

总的来说,考虑到我在 WPF 方面的有限经验,它是一个非常强大的框架,但不幸的是,您必须在此过程中“忘记”一些好的实践。

例如,依赖属性指定起来很麻烦。我总是觉得缺少一个 DependencyProperty 关键字来将我从这一切中抽象出来。

于 2012-11-06T14:01:19.473 回答