16

我自己设计的 wpf 用户控件有问题。问题是object reference not set to an instance of an object在设计时,当我在程序中实现用户控件时,我在 XAML 代码中遇到异常。

设计师向我展示了以下信息:

at
Microsoft.Expression.Platform.InstanceBuilders.InstanceBuilderOperations.InstantiateType(Type
type, Boolean supportInternal)    at
Microsoft.Expression.Platform.InstanceBuilders.ClrObjectInstanceBuilder.InstantiateTargetType(IInstanceBuilderContext
context, ViewNode viewNode)    at
Microsoft.Expression.Platform.InstanceBuilders.ClrObjectInstanceBuilder.Instantiate(IInstanceBuilderContext
context, ViewNode viewNode)    at
Microsoft.Expression.WpfPlatform.InstanceBuilders.FrameworkElementInstanceBuilder.Instantiate(IInstanceBuilderContext
context, ViewNode viewNode)    at
Microsoft.Expression.WpfPlatform.InstanceBuilders.UserControlInstanceBuilder.Instantiate(IInstanceBuilderContext
context, ViewNode viewNode)    at
Microsoft.Expression.Platform.InstanceBuilders.ViewNodeManager.CreateInstance(IInstanceBuilder
builder, ViewNode viewNode)

但我认为这些信息并没有真正的帮助......

如何修复或抑制此异常?

4

12 回答 12

28

如果您在 XAML 中有“未将对象引用设置为对象的实例”,但您的应用程序编译并运行良好,您通常会发现其原因是构造函数中无法在设计时解决的问题。

您只需单击位于设计器视图底部的“禁用项目代码”按钮,Visual Studio 设计器将停止尝试构建实例以提供设计时数据视图。

有关详细信息和屏幕截图,请参见此处

于 2016-05-23T06:14:20.480 回答
7

无论您的构造函数中发生什么,都会在设计时引发异常。我遇到了同样的问题——我只是在有问题的代码周围放了一个尝试——在我的情况下,我正在调用 ServiceLocator.Current,因为我正在使用 IoC 容器。但是在设计时没有容器。所以我包裹了一个try catch来抑制错误并且它起作用了。不是最好的解决方案......但它是一个解决方案。

于 2013-11-07T15:15:00.827 回答
4

我倾向于使用LicenseManager该类System.ComponentModel来避免我的 ViewModel 在设计时抛出令人讨厌的错误。例如:

public MyViewModel()
{
  if (LicenseManager.UsageMode == LicenseUsageMode.Runtime)
  {
    // Do runtime stuff
  }
}
于 2014-05-23T14:43:15.137 回答
2

调整@BobHorn 的例子,我得到了这个为我工作:

public class ViewModel
{
    public ViewModel()
    {
        if (!IsInDesignMode)
        {
            //Constructor code here...
        }
    }
    public bool IsInDesignMode
    {
        get
        {
            var prop = DesignerProperties.IsInDesignModeProperty;
            return (bool)DependencyPropertyDescriptor
                .FromProperty(prop, typeof(FrameworkElement))
                .Metadata.DefaultValue;
        }
    }
}

尽管使用他对构造函数的确切建议

public Main()
{
    if (IsInDesignMode) { return; }
    //Constructor code here...
}

也为我工作,我只是不喜欢用额外的返回语句来短路我的方法。我会投票赞成他的回答,还没有代表。

于 2014-07-28T19:55:45.430 回答
1

你可以这样做:

using System.ComponentModel;
using System.Windows;

/// <summary>
/// WPF Design Mode helper class.
/// </summary>
public static class DesignMode
{
    private static bool? _isInDesignMode;

    /// <summary>
    /// Gets a value indicating whether the control is in design mode (running in Blend
    /// or Visual Studio).
    /// </summary>
    public static bool IsInDesignMode
    {
        get
        {
            if (!_isInDesignMode.HasValue)
            {
                var prop = DesignerProperties.IsInDesignModeProperty;
                _isInDesignMode
                    = (bool)DependencyPropertyDescriptor
                    .FromProperty(prop, typeof(FrameworkElement))
                    .Metadata.DefaultValue;
            }

            return _isInDesignMode.Value;
        }
    }
}

然后,作为视图(或视图模型)构造函数的第一行,您可以执行以下操作:

if (DesignMode.IsInDesignMode) { return; }

这样,您的代码只会在您实际运行时运行。

于 2013-07-17T15:04:10.817 回答
1

我有类似的问题。您只需转到工具> 选项> XAML 设计器并启用该选项

“在 XAML 设计器中运行项目代码”。

最后重新启动 Visual Studio。我希望这将有所帮助。

于 2015-09-28T18:24:13.283 回答
1

当您在设计器中处理 WIndow/UserControl 时,它会“运行”无参数构造函数。如果你的代码依赖于通常由其他一些代码提供的东西,那么这通常会导致问题。设计者不会首先运行任何其他代码,因此通常在其他地方提供的依赖项可能会丢失并导致错误。抑制这些是检测该代码是否在设计器中运行的问题。只返回构造函数通常是最方便的:

public MainWindow()
{
    InitializeComponent();
    if (DesignerProperties.GetIsInDesignMode(new DependencyObject()))
        return;

    //code
}

更详细的https://social.technet.microsoft.com/wiki/contents/articles/29874.aspx?Redirected=true

于 2018-12-11T18:53:05.483 回答
0

如果其他人来到这里,我无意中将我的 MainWindow.xaml 文件拖到了一个子文件夹中。把它拖回来解决了这个问题。

于 2018-11-24T07:09:40.163 回答
0

在 XAML 的“部分类”中,如果可以看到“ [XamlCompilation(XamlCompilationOptions.Compile)]”,只需删除该行,然后再次尝试构建。

于 2017-12-28T07:16:32.953 回答
0

VS 2017 UWP:

if (false == Windows.ApplicationModel.DesignMode.DesignModeEnabled)
{
     // Anything in here need not be OK at Design time in Visual Studio                 
}
于 2017-08-18T16:54:19.887 回答
0

在重构期间,某些类的 C# 命名空间发生了变化。xmlns名称也相应更改。

然而,在一个地方xmlns改变了它不应该的地方。例如,像这样的代码:

<OldNS:SomeControl ... />

被错误地更改为

<NewNS:SomeControl ... />

因此,该控件SomeControl不存在于NewNS映射指示的命名空间中。

无论出于何种原因,我都没有将其标记为特定错误,而是得到“对象引用未设置为对象的实例”异常,而不知道源。

最终发现并修复这个错误解决了这个问题。

于 2021-09-15T18:50:54.280 回答
0

在错误列表窗口中将“仅构建”选项更改为“仅智能感知”

于 2020-03-11T04:10:07.697 回答