2017-01-14 1 views
0

Ich habe eine WPF-Anwendung, wo ich die MainWindow.xalm, MainWindow.xalm.cs und eine Klassendatei namens Utilities.cs. In der MainWindow.xaml erstelle ich ein Formular mit einem Seitenmenü, das Untermenüs hat. Ich aktiviere und deaktiviere die Seitenmenüs, je nachdem, was der Benutzer wählt. Ich habe Code in der Utilities.cs-Klasse erstellt, um abhängig davon, ob true oder false übergeben wird, zu aktivieren oder zu deaktivieren. In den MainWindow.xaml.cs Referenz ich die Utilities.cs Klasse wie folgt:Wie greife ich auf MainWindow XAML-Komponenten in einer separaten Klasse zu?

NBFoodPantry.Utilities nbuUtilities = new NBFoodPantry.Utilities(); 

In den Utilities.cs Datei ich die Mainwindow-Komponenten wie diese Referenz:

NBFoodPantry.MainWindow nbMainWindow = new MainWindow(); 

Hier ist der Beginn meine MainWindow.xaml.cs Datei:

namespace NBFoodPantry 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    /// 
    public partial class MainWindow : Window 
    { 
     SqlConnection sqlConn; 
     string strErrorLogPath, strErrorLogFile, strVCClientIDSelected, strFCClientIDSelected = string.empty; 
     string strVCName, strFCName, strVCButtonType, strDBInstance = string.empty; 
     bool blnRowSelected, blnUpdateGridLoaded;; 
     bool[] blnUpdateFields = new bool[9]; 
     DataRowView drvRow; 
     PrintDocument printDocument1 = new PrintDocument(); 
     PrintPreviewDialog printPreviewDialog = new PrintPreviewDialog(); 
     bool isWeeklyReportViewerLoaded, isPhoneReportViewerLoaded, isDependentAgeReportViewerLoaded; 
     BindingSource dataBindingSource = new BindingSource(); 

     NBFoodPantry.Utilities nbuUtilities = new NBFoodPantry.Utilities(); 

     public class Client 
     { 
      public string Name { get; set; } 

      public DataGridRow DGRow { get; set; } 
     } 



     #region MainWindow 
     public MainWindow() 
     { 

Hier ist der Beginn meiner Utilities.cs Datei:

Hier

ist ein paar der Routinen, die ich in die Untermenüs aus dem Hauptfenster zu verweisen erstellt:

public void EnableAddMenu(bool blnStatus) 
    { 
     nbMainWindow.miAdd.IsEnabled = blnStatus; 
    } 


    public void EnableAddSubMenus(bool blnStatus) 
    { 

     nbMainWindow.smiAddCheckinDate.IsEnabled = blnStatus; 
     nbMainWindow.smiAddMonthlyVisitDate.IsEnabled = blnStatus; 
     nbMainWindow.smiAddCardIssueDate.IsEnabled = blnStatus; 
     nbMainWindow.smiAddDependent.IsEnabled = blnStatus; 
     nbMainWindow.smiAddNote.IsEnabled = blnStatus; 
    } 

Jetzt, wenn ich versuche, das Programm auszuführen erhalte ich diese Meldung:

"An unhandled exception of type 'System.StackOverflowException' occurred in mscorlib.dll" 

auf Diese Codezeile:

PrintPreviewDialog printPreviewDialog = new PrintPreviewDialog(); 

Irgendeine Idee, warum ich jetzt diesen Fehler bekomme? Wie gehe ich mit diesen Fehlern um? Der Code funktionierte großartig, bis ich meinen duplizierten Code nach Utilities.cs verschoben habe.

+1

Die Schleife sollte ziemlich offensichtlich sein. MainWindow erstellt ein Dienstprogramm, das ein MainWindow erstellt, das ein Dienstprogramm erstellt. Die wahrscheinliche (kurzfristige) Antwort besteht darin, Ihre MainWindow-Instanz * an * Utilities zu übergeben. Die längerfristige Antwort ist, ein besseres Design wie MVVM mit richtiger OOP zu verwenden, wo diese Fehler zumindest weniger üblich sind. – BradleyDotNET

+0

#BradleyDotNET - Haben Sie ein Beispiel oder eine Erklärung zum "besseren Design wie MVVM mit richtiger OOP"? Ich bin selbst unterrichtet auf C# und würde es vorziehen, den richtigen Weg zu kennen, um diese Aufgaben zu erfüllen. Vielen Dank! – Cass

+0

Starten Sie hier: https://msdn.microsoft.com/en-us/library/dd460654(v=vs.100).aspx (OOP) und gehen Sie dann hier https://msdn.microsoft.com/en-us /library/hh848246.aspx (MVVM).Ich kann dich nicht stark genug dazu ermutigen, auch einen guten Programmierer zu finden, der dir etwas davon beibringen kann, es ist schwer, es selbständig zu lernen. Wenn Sie nicht wissen, gibt es dort bezahlte (und vielleicht kostenlose) Mentorship-Plattformen. Viele dieser Seiten Chat-Räume können auch helfen. Die beiden Konzepte sind leider zu groß für einen SO Post. – BradleyDotNET

Antwort

0

Ich nehme # BradleyDotNET Ansatz. Ich habe meinen Code dies in der Utilities.cs Datei geändert:

public void EnableAddMenu(bool blnStatus) 
    { 
     ((MainWindow)System.Windows.Application.Current.MainWindow).miAdd.IsEnabled = blnStatus; 
    } 


    public void EnableAddSubMenus(bool blnStatus) 
    { 
     ((MainWindow)System.Windows.Application.Current.MainWindow).smiAddCheckinDate.IsEnabled = blnStatus; 
     ((MainWindow)System.Windows.Application.Current.MainWindow).smiAddMonthlyVisitDate.IsEnabled = blnStatus; 
     ((MainWindow)System.Windows.Application.Current.MainWindow).smiAddCardIssueDate.IsEnabled = blnStatus; 
     ((MainWindow)System.Windows.Application.Current.MainWindow).smiAddDependent.IsEnabled = blnStatus; 
     ((MainWindow)System.Windows.Application.Current.MainWindow).smiAddNote.IsEnabled = blnStatus; 
    } 

Das ist nur für jetzt, ich bin auf der Suche auch auf dem MVVC approachto die richtige Art und Weise zu lernen.

0

Anstatt eine neue Instanz der MainWindow-Klasse in Ihrer Utilities-Klasse zu erstellen, können Sie der Utilities-Klasse einen Verweis auf die bereits initialisierte Instanz der MainWindow-Klasse hinzufügen. Sie benötigen einen Verweis auf diese bestimmte Instanz, um die darin enthaltenen Steuerelemente trotzdem aktivieren und deaktivieren zu können. Bitte beachten Sie den folgenden Beispielcode.

MainWindow.xaml.cs:

public partial class MainWindow : Window 
{ 
    SqlConnection sqlConn; 
    string strErrorLogPath, strErrorLogFile, strVCClientIDSelected, strFCClientIDSelected = string.empty; 
    string strVCName, strFCName, strVCButtonType, strDBInstance = string.empty; 
    bool blnRowSelected, blnUpdateGridLoaded;; 
    bool[] blnUpdateFields = new bool[9]; 
    DataRowView drvRow; 
    PrintDocument printDocument1 = new PrintDocument(); 
    PrintPreviewDialog printPreviewDialog = new PrintPreviewDialog(); 
    bool isWeeklyReportViewerLoaded, isPhoneReportViewerLoaded, isDependentAgeReportViewerLoaded; 
    BindingSource dataBindingSource = new BindingSource(); 

    public class Client 
    { 
     public string Name { get; set; } 

     public DataGridRow DGRow { get; set; } 
    } 

    NBFoodPantry.Utilities nbuUtilities; 
    public MainWindow() 
    { 
     InitializeComponent(); 
     nbuUtilities = new NBFoodPantry.Utilities(this); 
    } 
} 

Utilities.cs:

public class Utilities 
{ 
    NBFoodPantry.MainWindow nbMainWindow; 

    public Utilities(NBFoodPantry.MainWindow mainWindow) 
    { 
     nbMainWindow = mainWindow; 
    } 
} 
Verwandte Themen