Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 附加属性的怪异WPF错误_.net_Wpf - Fatal编程技术网

.net 附加属性的怪异WPF错误

.net 附加属性的怪异WPF错误,.net,wpf,.net,Wpf,我看到奇怪的行为。我强烈感觉到这是.net工具链中的一个bug 复制步骤: 创建WPF应用程序 在该解决方案中创建类库 在类库中定义一些公共类(可以为空) 在WPF应用程序中定义一些类,并将附加属性和窗口作为目标类 将其附加到窗口并提供值 你会得到一个错误: 对象“窗口”已具有 子项,无法添加“”。'窗罐 只接受一个孩子 若您更改了结构,以便在同一程序集中具有附加属性和值类的类(可以是类库或Wpf应用程序)可以正常工作 此外,如果将代码放在内容之后,它也可以正常工作。这会产生以下错误: <

我看到奇怪的行为。我强烈感觉到这是.net工具链中的一个bug

复制步骤:

  • 创建WPF应用程序
  • 在该解决方案中创建类库
  • 在类库中定义一些公共类(可以为空)
  • 在WPF应用程序中定义一些类,并将附加属性和窗口作为目标类
  • 将其附加到窗口并提供值
  • 你会得到一个错误:

    对象“窗口”已具有 子项,无法添加“”。'窗罐 只接受一个孩子

    若您更改了结构,以便在同一程序集中具有附加属性和值类的类(可以是类库或Wpf应用程序)可以正常工作

    此外,如果将代码放在内容之后,它也可以正常工作。这会产生以下错误:

    <Window x:Class="WpfApplication9.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:my="clr-namespace:ClassLibrary1;assembly=ClassLibrary1"
            xmlns:my2="clr-namespace:ClassLibrary1"
            Title="MainWindow" Height="350" Width="525">
    
        <my2:Property.MyProperty>
            <my:ValueClass />
        </my2:Property.MyProperty>
    
        <Grid>
    
        </Grid>
    </Window>
    
    
    
    这并不是:

    <Grid>
    
    </Grid>    
    
    <my2:Property.MyProperty>
        <my:ValueClass />
    </my2:Property.MyProperty>
    

    
    

    有什么想法吗


    谢谢

    这是由编译XAML的自引用方式造成的。尽管您有一个对包含附加属性的程序集(应用程序程序集)的命名空间引用,但实际上,当您需要XAML编译器确定元素语法引用的是附加属性而不是普通元素时,该程序集正处于编译过程中

    正如您所发现的,将附加属性放在内容之后就足够提示它在信息不完整的情况下做出正确的选择。另一方面,知道这是问题所在,您也可以简单地将附加属性放入外部程序集中,例如放入控件库中,这也将避免鸡和蛋的问题

    在一个完美的世界中,C#编译器和XAML编译器将彼此完全集成,这个问题将消失,但在此之前,我们必须使用变通方法

    编辑:

    另一种解释是因为它有点复杂

    编译应用程序程序集时,它同时包含C#和XAML。在上面的示例代码中,XAML引用了在同一程序集的C#代码中定义的附加属性。因此,XAML编译器需要有应用程序程序集的编译版本,以便知道
    Property.MyProperty
    是附加属性。但是C#编译器还不能编译您的应用程序集,因为XAML尚未编译。这就是鸡和蛋的问题:C#和XAML都是相互依赖的

    必须给出一些东西,XAML编译器继续使用不完整的信息编译应用程序的XAML文件,即使应用程序集尚未编译。在执行此操作的过程中,可能会出现错误,例如未检测到在同一程序集中定义的附着特性。为什么它有时会起作用?我们可以注意到,他们已经做了一些努力来处理一些常见的案例,因此它在大多数情况下似乎都有效,但正如您所发现的,它并不是一直有效


    最简单的解决方案是将附着的特性移动到外部部件中。附加属性(如控件)通常与库关联,因此问题通常不会出现。

    @Rick Sladkey我没有清楚地理解第一段,您能稍微扩展一下吗?附加属性也位于XAML所在的程序集中。值在另一个值中。@Andrey:当然可以。“我对答案补充了一点。”瑞克·斯莱德基,谢谢,非常有趣。但是按照你的解释,我不明白当两个类:一个具有属性的类和一个用于值的类进入XAML所在的同一个程序集中时,它为什么会起作用。@Andrey:正如我提到的,这是他们选择处理的“常见情况”,可能是因为用一个外部程序集和一个半编译的程序集解决相互依赖关系既简单又不混乱。我不能确切地说;“这和工具的内部结构有关。”瑞克·斯莱德基(Rick Sladkey)个人说,我看不出有什么问题。XAML编译器只能将XAML转换为C#,而不验证其内容。然后,C#编译器在编译过程中可以解决所有的相互依赖关系,因为它已经具备了这种能力。对我来说,XAML编译器似乎咬得太多了。