web-dev-qa-db-ja.com

デザイン時にXAMLコードで「オブジェクト参照がオブジェクトのインスタンスに設定されていない」例外を回避するにはどうすればよいですか?

私自身が考案したwpfユーザーコントロールに問題があります。問題は、object reference not set to an instance of an object設計時のXAMLコードでの例外。プログラムにユーザーコントロールを実装すると発生します。

例外を修正または抑制するにはどうすればよいですか?

編集1

デザイナーは私に次の情報を示します:

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コンテキスト、ViewNode viewNode)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ビルダー、ViewNode viewNode)

あまり役に立たないと思います...

15
Kimbo

XAMLで「オブジェクト参照がオブジェクトのインスタンスに設定されていない」が、アプリケーションが正常にコンパイルおよび実行される場合、通常、その原因は、設計時に解決できないコンストラクター内の何かであることがわかります。

デザイナビューの下部にある[プロジェクトコードを無効にする]ボタンをクリックするだけで、Visual Studioデザイナはインスタンスを作成してデザイン時データビューを提供するのをやめます。

詳細情報とスクリーンショットについては こちら を参照してください。

18
Lirrik

コンストラクターで何が起こっていても、設計時に例外がスローされます。私は同じ問題を抱えていました-私は問題のあるコードの周りに試行錯誤を置きました-私の場合、IoCコンテナーを使用しているので、ServiceLocator.Currentを呼び出していました。ただし、設計時にはコンテナはありません。だから私はエラーを抑制するためにトライキャッチに包みました、そしてそれはうまくいきました。最善の解決策ではありません...しかし、その解決策です。

5
Shumii

ViewModelが設計時に厄介なエラーをスローしないように、System.ComponentModelLicenseManagerクラスを使用する傾向があります。例えば:

public MyViewModel()
{
  if (LicenseManager.UsageMode == LicenseUsageMode.Runtime)
  {
    // Do runtime stuff
  }
}
3
Gareth

@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...
}

私もうまくいきました、私はメソッドを余分なreturnステートメントで短絡しない方がいいです。私は彼の答えに賛成票を投じたでしょうが、まだ担当者がいません。

2
aherocalledFrog

同様の問題がありました。 Tools> Options> XAML Designerに移動してオプションを有効にするだけです

"XAMLデザイナーでプロジェクトコードを実行します。"

最後にVisual Studioを再起動します。これがお役に立てば幸いです。

1
Dark Knight

あなたはこのようなことをすることができます:

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; }

これにより、実際にコードを実行している場合にのみコードが実行されます。

1
Bob Horn

デザイナーでWIndow/UserControlを操作すると、パラメーターのないコンストラクターが「実行」されます。他のコードによって通常提供される何かに依存しているコードがそこにある場合、これはしばしば問題を引き起こします。設計者は最初に他のコードを実行しないため、通常は他の場所で提供される依存関係が欠落していてエラーが発生する可能性があります。これらを抑制することは、そのコードがデザイナーで実行されているかどうかを検出することです。多くの場合、コンストラクタを返すだけが最も便利です。

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

    //code
}

より詳細 https://social.technet.Microsoft.com/wiki/contents/articles/29874.aspx?Redirected=true

0
Raj

他の誰かがここに来た場合、MainWindow.xamlファイルを誤ってサブフォルダにドラッグしました。ドラッグして戻すと、問題が解決しました。

0
Alan

エラーリストウィンドウの[ビルドのみ]オプションを[インテリセンスのみ]に変更します。

0
Yerla

XAMLの「部分クラス」で「[XamlCompilation(XamlCompilationOptions.Compile)]」が表示された場合は、その行を削除してから、もう一度ビルドしてみてください。

0
Jagger

VS 2017 UWP:

if (false == Windows.ApplicationModel.DesignMode.DesignModeEnabled)
{
     // Anything in here need not be OK at Design time in Visual Studio                 
}
0
Paulustrious