【问题标题】:WPF custom control XAML null errorWPF 自定义控件 XAML 空错误
【发布时间】:2009-10-01 15:24:47
【问题描述】:

又一个奇怪的 WPF 错误:

我在一个简单的 XAML 页面中有一个自定义控件。该项目构建和运行完美,没有错误。

这是 XAML:

<Window x:Class="Grapher2.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:graph="clr-namespace:Grapher2"
Title="Grapher" Width="800" Height="600">

<StackPanel Name="container"  Width="700" Height="500">
    <graph:GraphCanvas x:Name="graphCanvas" Width="700" Height="500" Background="#ddd" />
</StackPanel>

但是当我尝试在 XAML 设计器窗口中查看 XAML 页面时,我收到以下消息:

“加载问题--文档包含必须修复的错误...”

当我点击“重新加载设计器”链接时,错误列表中会弹出一个错误:

“对象引用未设置为对象的实例”

并且以“graph:GraphCanvas...”开头的行带有下划线。

我最初是在我们的开发服务器上开发的,在那里,一切都一样,除了错误是:

“请求'System.Security.Permissions.SecurityPermission类型的权限(......等等等等......失败。)”

同样,一切正常,除了我无法在 XAML 设计器窗口中查看页面,这使我无法开发应用程序的其余部分。

我尝试了清理、构建、重建以及这些命令的所有命令组合,但没有成功。

编辑:

请记住,这是我的第一个自定义控件,我可能会做一些可怕的、可怕的错误。就像我说的,这个应用程序编译和运行都很漂亮,所以我有点迷惑。

编辑 #2:

我的派生画布不是部分类。根据我对 InitializeComponent 工作原理 (What does InitializeComponent() do, and how does it work in WPF?) 的理解,没有自动生成的包含链接到我的控件的 InitializeComponent 的部分类。同样,除了破坏 XAML 设计视图之外,没有它,该控件也可以正常工作。

【问题讨论】:

    标签: wpf exception xaml null parsing


    【解决方案1】:

    我最近遇到了类似的问题。基本上我的理解是,在设计器中,有些事情发生的顺序与运行时不完全相同,而有些你认为永远不会为空的事情实际上在设计时是空的。

    我通过这种方式解决了问题:在我的控件中注释了大部分代码,直到 Cider 中没有错误,然后取消注释,直到我再次收到错误为止。然后,当错误源被定位时,我用

    包围了有问题的部分
    if (something != null)
    {
    ...
    }
    

    即使我觉得不可能为空。一段时间后,我摆脱了错误。

    不是很“科学”的方法,但它解决了我的问题。 :)

    【讨论】:

    • 我已经完全按照您之前的描述完成了(通常是在所有“真正的”研究都没有结果时的最后努力)。阅读您的帖子后,我在这里尝试了一下,发现我在 Initialized 事件中的控件窗口上添加了一个 KeyUp 事件侦听器。显然,设计者还运行了 Initialized 事件——父窗口为空。谢谢!
    【解决方案2】:

    不幸的是,Visual Studio 2008 中的 Cider 设计器存在问题,这种错误非常常见。 VS2010 中的版本有了很大改进,但是当您在 VS2008 中遇到这个问题时,这并不令人欣慰。

    【讨论】:

    • 不想引起争议,但如果您可以添加指向参考的链接,表明这是苹果酒错误而不是我可以解决的问题,我会接受这个答案。如果我在第二天左右得到足够的佐证,我也会接受。
    【解决方案3】:

    我不确定“Grapher2”是什么,但您可以检查以确保其构造函数中没有代码在设计器实例化时无法正确运行。像数据库调用这样的东西会出现问题。

    【讨论】:

    • Grapher2 是我的自定义控件。这里有一个想法:每个自定义控件都需要有自己的 XAML 文件吗?这个没有。
    • 自定义控件没有 XAML 文件。它将有一个主题作为 ResourceDictionary 存储在 generic.xaml 文件中。你真的想要一个自定义控件(你需要消费者定义的主题)吗?或者用户控件是否足以满足您正在做的事情。
    • 是的,我正在对图像进行低级像素操作以响应鼠标移动:stackoverflow.com/questions/1487831/…。但我根本不需要消费者定义的主题。
    【解决方案4】:

    我见过类似的问题。

    这只是部分解决方案,因为它不会在设计模式下呈现在父级中,但它会消除错误。这是迄今为止我能找到的最佳解决方案。

    在自定义控件的构造函数中。

    if (!System.ComponentModel.DesignerProperties.GetIsInDesignMode(this))
                InitializeComponent();
    

    希望对您有所帮助,或者可能会帮助您找到更好的解决方案。如果你这样做,请发布它以便我可以使用它;)

    编辑
    不使用上面的代码时出现不同的错误: 无法创建 '' 类型的实例

    所以可能与我看到的问题不同,但听起来可能是相关的。

    【讨论】:

    • 我的控件扩展了 Canvas。但它不识别 InitializeComponent。这可能是个问题吗?
    • 我对 WPF 还很陌生,但我认为您可能会有所了解。我刚刚尝试扩展 Canvas,它有一个 InitializeComponent 方法。
    • 您究竟是如何扩展 Canvas 的?您是否在声明的末尾添加了新项目 > 类并输入“:画布”?我就是这样做的。你的课有偏吗?
    • 我添加了新项目“用户控件”,然后在创建的两个部分文件中将 : UserControl 替换为 : Canvas。
    • 不幸的是,用户控件和自定义控件之间存在一个非常重要且不直观的区别。那么问题就变成了:为什么扩展 Canvas 的用户控件会得到 InitializeComponent 而自定义控件却没有呢?
    猜你喜欢
    • 2013-01-15
    • 2010-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多