2016-11-08 8 views
1

私はこの奇妙なバグを持っています。私は自分のプロジェクトをビルドするとき、常にシングルトンウィンドウの2つのインスタンスをポップアップさせます。 Here is videoが起こっています。私はそれがどんな助けになるとは思わないが、ここには窓のほとんどがある。コードの背後には、マウスの動きと終了イベントのイベントだけがあります。建物のビジュアルスタジオのバグ

<Window x:Class="Scoreboard.OutputWindow" 
    d:DataContext="{d:DesignInstance viewModel:ControlPanel}" 
    Title="OutputWindow" Height="375" Width="540" 
    Background="{Binding AppData.Settings.Color, Converter={converters:ColorToBrushConverter}}" 
    MouseLeftButtonDown="football_MouseLeftButtonDown" 
    MouseLeftButtonUp="football_MouseLeftButtonUp" 
    MouseMove="football_MouseMove"> 
    <Window.InputBindings> 
     <KeyBinding Modifiers="Control" Key="F" Command="{Binding FullScreenCommand}" /> 
    </Window.InputBindings> 
    <Grid ...> 
    </Grid> 
</Window> 

このウィンドウは、私のViewModelのシングルトンです。私はそこからアクセスします。私の2台のPCの両方で発生します。

編集: ViewModelから削除すると、それはもう発生しません。しかし、私はそれを必要としている。 EDIT2:Here is新しいプロジェクトがそのウィンドウに表示されます。それはまったく同じように動作しませんが、デバッグ時にビルドするように変更を加えると、sturtupでコンストラクタでブレークポイントに捕捉されない別のOutputWindowが作​​成されます。これは、暗黙的にプロパティのゲッターでnew OutputWindow()作成

public ViewModel() 
{ 
    OutputWindow.IsEnabled = true; 
} 

+0

コンストラクタにブレークポイントを設定して、2番目のインスタンスがどこから作成されているかを確認しましたか? – ChrisF

+1

これは単なるビルドであり、起動しません。両方のインスタンスがそこにいてはいけません。 – Korhak

+0

プロジェクトのプロパティに 'Build Events'がありますか? (特にビルド後のコマンド) – haindl

答えて

1

あなたの問題の根本的な原因は、あなたの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.exeMainWindowの新しいインスタンスを作成するよう指示します。

XDesProc.exeは、プロジェクトをビルドする場合はVisual StudioでXAMLデザイナー、おそらくデザイナーのための責任がある成分でリフレッシュすべきである。)そして、そこから上の上に示すように、方法は次のとおりです。
A新しいですViewModelMainWindowの暗黙的なDataContextで作成され、の新しいインスタンスを暗黙的にプロパティのゲッターに作成し、それ自体はShow()を呼び出します。そして、あなたはあなたの画面にOutputWindowを持っています!
場合によっては、デザイナー(または別のコンポーネント)が2回呼び出されたために2つだけ表示されることもあります。

したがって、最終行 - コードを修正するためには何が必要ですか?
複数の解決策があります。
ViewModelOutputWindowの暗黙的な作成を停止することが最も重要です。あなたは、次のいずれか(またはそれ以上)を行うことでこれを実現することができます

  • ViewModelのコンストラクタでOutputWindow.IsEnabled = true;を削除します。
  • コンストラクタにShow();をコールしないでください。
  • ViewModelを暗黙的に<Window.DataContext><local:ViewModel />を使用してインスタンス化しないでください。

単純なViewModelのインスタンスを作成するだけでは、暗黙的にウィンドウを表示するのは間違っていると言えます。だから、あなたがこの不運な出来事の不運な連鎖を破るなら、あなたの問題は永遠に消え去るでしょう。

+0

何が起こったのか、ありがとう、素敵な詳細な説明。 'OutputWindow.IsEnabled = true'があったので、getterが呼び出されます。あなたが書いたように、私は 'Show()'をコンストラクタから削除し、 'MainWindow'の初期化と問題解決の後でそれを移動しました。あなたのための誇り。 – Korhak

+0

@Korhak大歓迎です!私はあなたを助けることができてうれしい! :-) – haindl