如何在设计时避免XAML代码中的"对象引用未设置为对象实例"异常?

Kim*_*mbo 15 c# wpf user-controls exception

我有一个wpf usercontrol的问题,这是我自己设计的.问题是object reference not set to an instance of an object,当我在程序中实现usercontrol时,我在设计时遇到XAML代码中的异常.

我该如何修复或压制这个例外?

编辑1

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

at Microsoft.Expression.Platform.Platform.InstanceBuilders.Clstform.Platform.Instantiate中的Microsoft.Expression.Platform.InstantiateType(Type type,Boolean supportInternal),Microsoft.Expression.Platform.InstantiateTargetType(IInstanceBuilderContext context,ViewNode viewNode)at Microsoft.Expression.Platform.InstanceBuilders.ClrObjectInstanceBuilder.Instantiate (IInstanceBuilderContext上下文,viewNode viewNode)在Microsoft.Expression.WpfPlatform.InstanceBuilders.FrameworkElementInstanceBuilder.Instantiate(IInstanceBuilderContext上下文,viewNode viewNode)在Microsoft.Expression.WpfPlatform.InstanceBuilders.UserControlInstanceBuilder.Instantiate(IInstanceBuilderContext上下文,viewNode viewNode)在Microsoft.Expression. Platform.InstanceBuilders.ViewNodeManager.CreateInstance(IInstanceBuilder builder,ViewNode viewNode)

我认为他们并没有真正的帮助......

小智 21

如果你在XAML中有'对象引用未设置为对象的实例',但是你的应用程序编译并运行正常,你通常会发现它的原因是构造函数中的某些东西在设计时无法解析.

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

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

  • 如果当前xaml上的设计器未加载,则“禁用项目代码”按钮将不可用。加载一个好的xaml以使该按钮可用。现在,该设置将应用于拒绝加载的xaml。 (3认同)

Shu*_*mii 5

无论构造函数中发生什么,都会在设计时抛出异常.我有同样的问题 - 我只是试着抓住有问题的代码 - 在我的情况下,当我使用IoC容器时,我正在调用ServiceLocator.Current.但在设计时没有容器.所以我用try catch包装来抑制错误并且它有效.不是最好的解决方案......但它是一个解决方案.


Gar*_*eth 5

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

public MyViewModel()
{
  if (LicenseManager.UsageMode == LicenseUsageMode.Runtime)
  {
    // Do runtime stuff
  }
}
Run Code Online (Sandbox Code Playgroud)


Bob*_*orn 2

你可以这样做:

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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

if (DesignMode.IsInDesignMode) { return; }
Run Code Online (Sandbox Code Playgroud)

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