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

7

コンストラクターで何が起こっても、設計時に例外がスローされます。私は同じ問題を抱えていました-問題のあるコードの周りにtry catchを配置しました-私の場合、IoCコンテナーを使用しているため、ServiceLocator.Currentを呼び出していました。しかし、設計時にはコンテナーはありません。そのため、try catch でラップしてエラーを抑制したところ、機能しました。最善の解決策ではありません...しかし、その解決策です。

于 2013-11-07T15:15:00.827 に答える
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 に答える
0

リファクタリング中に、特定のクラスの C# 名前空間が変更されました。それxmlnsに伴い名称も変更。

ただし、ある場所で、あるべきではない場所xmlnsが変更されました。たとえば、次のようなコード:

<OldNS:SomeControl ... />

に誤って変更されました

<NewNS:SomeControl ... />

したがって、コントロールは、マッピングSomeControlによって示される名前空間に存在しませんでした。NewNS

これを特定のエラーとしてフラグを立てる代わりに、何らかの理由で「オブジェクト参照がオブジェクトのインスタンスに設定されていません」という例外が発生し、ソースについての手がかりがありませんでした。

最終的に、この間違いを見つけて修正することで、問題は解決しました。

于 2021-09-15T18:50:54.280 に答える
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 に答える