私自身が考案した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)
あまり役に立たないと思います...
XAMLで「オブジェクト参照がオブジェクトのインスタンスに設定されていない」が、アプリケーションが正常にコンパイルおよび実行される場合、通常、その原因は、設計時に解決できないコンストラクター内の何かであることがわかります。
デザイナビューの下部にある[プロジェクトコードを無効にする]ボタンをクリックするだけで、Visual Studioデザイナはインスタンスを作成してデザイン時データビューを提供するのをやめます。
詳細情報とスクリーンショットについては こちら を参照してください。
コンストラクターで何が起こっていても、設計時に例外がスローされます。私は同じ問題を抱えていました-私は問題のあるコードの周りに試行錯誤を置きました-私の場合、IoCコンテナーを使用しているので、ServiceLocator.Currentを呼び出していました。ただし、設計時にはコンテナはありません。だから私はエラーを抑制するためにトライキャッチに包みました、そしてそれはうまくいきました。最善の解決策ではありません...しかし、その解決策です。
ViewModelが設計時に厄介なエラーをスローしないように、System.ComponentModel
のLicenseManager
クラスを使用する傾向があります。例えば:
public MyViewModel()
{
if (LicenseManager.UsageMode == LicenseUsageMode.Runtime)
{
// Do runtime stuff
}
}
@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ステートメントで短絡しない方がいいです。私は彼の答えに賛成票を投じたでしょうが、まだ担当者がいません。
同様の問題がありました。 Tools> Options> XAML Designerに移動してオプションを有効にするだけです
"XAMLデザイナーでプロジェクトコードを実行します。"
最後にVisual Studioを再起動します。これがお役に立てば幸いです。
あなたはこのようなことをすることができます:
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; }
これにより、実際にコードを実行している場合にのみコードが実行されます。
デザイナーでWIndow/UserControlを操作すると、パラメーターのないコンストラクターが「実行」されます。他のコードによって通常提供される何かに依存しているコードがそこにある場合、これはしばしば問題を引き起こします。設計者は最初に他のコードを実行しないため、通常は他の場所で提供される依存関係が欠落していてエラーが発生する可能性があります。これらを抑制することは、そのコードがデザイナーで実行されているかどうかを検出することです。多くの場合、コンストラクタを返すだけが最も便利です。
public MainWindow()
{
InitializeComponent();
if (DesignerProperties.GetIsInDesignMode(new DependencyObject()))
return;
//code
}
より詳細 https://social.technet.Microsoft.com/wiki/contents/articles/29874.aspx?Redirected=true
他の誰かがここに来た場合、MainWindow.xamlファイルを誤ってサブフォルダにドラッグしました。ドラッグして戻すと、問題が解決しました。
エラーリストウィンドウの[ビルドのみ]オプションを[インテリセンスのみ]に変更します。
XAMLの「部分クラス」で「[XamlCompilation(XamlCompilationOptions.Compile)]
」が表示された場合は、その行を削除してから、もう一度ビルドしてみてください。
VS 2017 UWP:
if (false == Windows.ApplicationModel.DesignMode.DesignModeEnabled)
{
// Anything in here need not be OK at Design time in Visual Studio
}