2016-04-19 8 views
-1

Ich habe eine MainWindow-Klasse, die als einige Ereignisse - alle von ihnen sollten eine Methode in einer anderen Klasse aufrufen.Vermeiden Sie SizeChanged Ereignis beim Start

public partial class MainWindow : Window 
    { 

     public MainWindow() 
    {   
     InitializeComponent(); 

     getdata.MainWindow = this; 
    } 


    private void button_Click(object sender, RoutedEventArgs e) 
    { 
     getdata go = new getdata(); 
     go.clear(); 
    } 

    private void comboBox1_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     getdata go = new getdata(); 
     go.clear(); 
    } 

private void comboBox2_DropDownClosed(object sender, EventArgs e) 
    { 

     getdata go = new getdata(); 
     go.clear(); 

    } 

    private void MainWindow_SizeChanged(object sender, SizeChangedEventArgs e)   { 
     getdata go = new getdata(); 
     go.clear(); //<-this causes exception on Startup 
    } 

} 

Das Problem ist, dass die MainWindow_SizeChanged Event auch beim Start des Programms ausgelöst wird, aber die klaren Verfahren verwenden auch einige Objekte, die noch nicht bei Start erstellt, die einen Fehler verursacht. Wie kann ich dies vermeiden und dieses Ereignis nur auslösen, wenn die Größe während der Ausführung des Programms geändert wird?

+0

Welche Objekte werden verwendet, die noch nicht initialisiert wurden? –

+1

Legen Sie ein boolesches Flag fest, wenn die Objekte erstellt wurden, und führen Sie im SizeChanged-Handler nichts aus, wenn das Flag nicht festgelegt wurde. –

Antwort

1

Sie haben die IsLoaded-Eigenschaft von Window.

Sie können dies überprüfen, bevor Sie den Code ausführen.

+0

Zu dem Zeitpunkt, als das in der Größe veränderte Ereignis aufgerufen wurde, wäre das Fenster nicht geladen worden? –

+0

Wenn das Fenster geladen wird und das SizeChanged-Ereignis ausgelöst wird, ist IsLoaded falsch, also würde dies funktionieren – Marc

0

Sie können überprüfen, ob ein Element bei der Größenanpassung null ist, damit Sie vermeiden können, dass dies ein Problem ist. Dies kann mit den Operatoren null coalescence und null conditional geschehen. Wenn Sie zum Beispiel den Wert eines textBox beim Start verwenden, aber es war nicht instanziiert wurden, können Sie diese verwenden

string someText = tB1?.Text? 
if(someText == null) return; 
0

SizeChanged Ereignis ausgelöst wird, bevor das Fenster geladen wird. Sie können versuchen, das SizeChanged Ereignis als Teil des Loaded Ereignisses zu abonnieren und es in dem Unloaded wie unten gezeigt abzumelden.

//XAML 
<Window x:Class="MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525" 
     Loaded="Window_Loaded" 
     Unloaded="MainWindow_OnUnloaded"> 

//Code Behind 
private void Window_SizeChanged(object sender, SizeChangedEventArgs e) 
{ 
    Debug.WriteLine("Size Changed Triggered"); 
} 

private void Window_Loaded(object sender, RoutedEventArgs e) 
{ 
    SizeChanged += Window_SizeChanged; 
} 

private void MainWindow_OnUnloaded(object sender, RoutedEventArgs e) 
{ 
    SizeChanged -= Window_SizeChanged; 
}