C# 为什么我不能为WPF中范围为内部的UserControl分配名称值?

C# 为什么我不能为WPF中范围为内部的UserControl分配名称值?,c#,wpf,C#,Wpf,我有一个UserControl,我已将其设置为Internal: UserControl x:Class="ClassName" x:ClassModifier="internal" 它与.cs文件匹配: internal partial class ClassName : UserControl { public ClassName() { InitializeComponent();

我有一个UserControl,我已将其设置为Internal:

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.
如果我将访问修饰符更改为public,则所有操作都会按预期进行


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

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

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

对于UserControl Name属性,您可能会遇到相同的限制

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


例如,依赖项属性很难指定。我总是觉得缺少dependencProperty关键字来将我从所有这些中抽象出来。

我相信这是由WPF的编译模型造成的。我从内存中引用了这句话,但找不到备份它的资源,但我相信WPF编译分两步进行:基本上,“codebehind”部分首先编译到一个中间程序集,然后XAML被编译为引用该中间程序集,结果被合并到最终程序集

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

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

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


窗口是否与控件位于同一程序集中?是。我只使用一个程序集,尽管它们位于不同的名称空间中。名称空间包含在窗口的xaml顶部。谢谢。这似乎是一种非常奇怪的做事方式。典型的百万美元。