あなたの問題の根本的な原因は、あなたのViewModel
に次の行である
private OutputWindow _outputWindow;
public OutputWindow OutputWindow =>
_outputWindow ?? (_outputWindow = new OutputWindow { DataContext = this });
コンストラクタは、このようになります
:
public OutputWindow()
{
InitializeComponent();
Show();
}
これはありませんその瞬間に悪いが、あなたのMainWindow
がインスタンス化されるたびに、ViewModel
の新しいインスタンスが暗黙のうちにMainWindow
であるため、このコードでも作成されます。
<Window.DataContext>
<local:ViewModel />
</Window.DataContext>
さて、OutputWindow
がスタート上に表示される理由を説明すること - しかしそれはビルド上になぜ表示されますか?
は(。それとも、Visual StudioでMainWindow.xaml
のXAMLコードを開いた場合でも、私の場合)
犯人を見つけた場合、それはdevenv.exe
由来するここで、この小さな宝石です:だから、なぜ
TestApplication.exe!TestApplication.OutputWindow.OutputWindow() Line 15
TestApplication.exe!TestApplication.ViewModel.OutputWindow.get() Line 6
TestApplication.exe!TestApplication.ViewModel.ViewModel() Line 10
...
mscorlib.dll!System.Activator.CreateInstance(System.Type type, bool nonPublic)
...
Microsoft.VisualStudio.DesignTools.Platform.dll!Microsoft.VisualStudio.DesignTools.Platform.InstanceBuilders.ClrObjectInstanceBuilder.Instantiate(Microsoft.VisualStudio.DesignTools.Platform.InstanceBuilders.IInstanceBuilderContext context, Microsoft.VisualStudio.DesignTools.Platform.InstanceBuilders.ViewNode viewNode = {Microsoft.VisualStudio.DesignTools.Platform.InstanceBuilders.ViewNode}) Unknown
Microsoft.VisualStudio.DesignTools.Platform.dll!Microsoft.VisualStudio.DesignTools.Platform.InstanceBuilders.ViewNodeManager.CreateInstance(Microsoft.VisualStudio.DesignTools.Platform.InstanceBuilders.IInstanceBuilder builder, Microsoft.VisualStudio.DesignTools.Platform.InstanceBuilders.ViewNode viewNode) Unknown
Microsoft.VisualStudio.DesignTools.Platform.dll!Microsoft.VisualStudio.DesignTools.Platform.InstanceBuilders.ViewNodeManager.Instantiate(Microsoft.VisualStudio.DesignTools.Platform.InstanceBuilders.ViewNode viewNode = {Microsoft.VisualStudio.DesignTools.Platform.InstanceBuilders.ViewNode}) Unknown
...
XDesProc.exe!Microsoft.VisualStudio.DesignTools.DesignerContract.Isolation.DesignerProcess.RunApplication()
...
mscorlib.dll!System.Threading.ThreadHelper.ThreadStart()
それは起こるか?
XAMLデザイナーのビルド時またはオープン時に、Visual Studioはスレッドを開始し、XDesProc.exe
にMainWindow
の新しいインスタンスを作成するよう指示します。
(XDesProc.exe
は、プロジェクトをビルドする場合はVisual StudioでXAMLデザイナー、おそらくデザイナーのための責任がある成分でリフレッシュすべきである。)そして、そこから上の上に示すように、方法は次のとおりです。
A新しいですViewModel
はMainWindow
の暗黙的なDataContext
で作成され、の新しいインスタンスを暗黙的にプロパティのゲッターに作成し、それ自体はShow()
を呼び出します。そして、あなたはあなたの画面にOutputWindow
を持っています!
場合によっては、デザイナー(または別のコンポーネント)が2回呼び出されたために2つだけ表示されることもあります。
したがって、最終行 - コードを修正するためには何が必要ですか?
複数の解決策があります。
ViewModel
にOutputWindow
の暗黙的な作成を停止することが最も重要です。あなたは、次のいずれか(またはそれ以上)を行うことでこれを実現することができます
- が
ViewModel
のコンストラクタでOutputWindow.IsEnabled = true;
を削除します。
- コンストラクタに
Show();
をコールしないでください。
ViewModel
を暗黙的に<Window.DataContext><local:ViewModel />
を使用してインスタンス化しないでください。
単純なViewModelのインスタンスを作成するだけでは、暗黙的にウィンドウを表示するのは間違っていると言えます。だから、あなたがこの不運な出来事の不運な連鎖を破るなら、あなたの問題は永遠に消え去るでしょう。
コンストラクタにブレークポイントを設定して、2番目のインスタンスがどこから作成されているかを確認しましたか? – ChrisF
これは単なるビルドであり、起動しません。両方のインスタンスがそこにいてはいけません。 – Korhak
プロジェクトのプロパティに 'Build Events'がありますか? (特にビルド後のコマンド) – haindl