2017-01-14 2 views
0

У меня есть приложение WPF, где у меня есть MainWindow.xalm, MainWindow.xalm.cs и файл класса Utilities.cs. В MainWindow.xaml я создаю форму с боковым меню, которое имеет подменю. Я включаю и отключаю боковые меню в зависимости от того, что пользователь выбирает. Я создал код в классе Utilities.cs для включения или отключения в зависимости от того, передано ли значение true или false. В MainWindow.xaml.cs я ссылаться на класс Utilities.cs так:Как получить доступ к компонентам MainWindow XAML в отдельном классе?

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

В Utilities.cs файл я ссылаться на компоненты MainWindow, как это:

NBFoodPantry.MainWindow nbMainWindow = new MainWindow(); 

Вот начало мой MainWindow.xaml.cs файл:

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() 
     { 

Вот начало моего Utilities.cs файла:

namespace NBFoodPantry 
{ 
    public class Utilities 
    { 
     NBFoodPantry.MainWindow nbMainWindow = new MainWindow(); 

Вот несколько подпрограмм, которые я создал, чтобы ссылаться на подменю из MainWindow:

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; 
    } 

Теперь, когда я пытаюсь запустить программу, которую я получаю сообщение:

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

на эта строка кода:

PrintPreviewDialog printPreviewDialog = new PrintPreviewDialog(); 

Любая идея, почему я сейчас получу эту ошибку? Как обрабатывать эти ошибки? Код работал отлично, пока я не переместил мой дублированный код в Utilities.cs.

+1

Петля должна быть достаточно очевидной. MainWindow создает Утилиты, которые создают MainWindow, который создает Утилиты .... Вероятный (краткосрочный) ответ заключается в передаче вашего экземпляра MainWindow * в * Утилиты. Более долгосрочный ответ заключается в использовании лучшего дизайна, такого как MVVM, с надлежащим ООП, где эти ошибки, по крайней мере, менее распространены. – BradleyDotNET

+0

#BradleyDotNET - Есть ли у вас какой-либо пример или пояснение в отношении «лучшего дизайна, такого как MVVM с надлежащим ООП»? Я сам преподаю на C# и предпочел бы изучить правильный способ выполнения этих задач. Спасибо! – Cass

+0

Начните здесь: https://msdn.microsoft.com/en-us/library/dd460654(v=vs.100).aspx (OOP), а затем перейдите сюда https://msdn.microsoft.com/en-us /library/hh848246.aspx (MVVM).Я не могу вас убедить достаточно сильно, чтобы найти хорошего программиста, чтобы попытаться научить вас этому, его трудно подобрать самостоятельно. Если вы не знаете, что там платят (и, возможно, бесплатные) наставники. Многие из этих чатов могут помочь. Эти две концепции слишком велики для SO-сообщения, к сожалению. – BradleyDotNET

ответ

0

Я принимаю # BradleyDotNET Подход. Я изменил код этого в файле Utilities.cs:

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; 
    } 

Это только сейчас, я также смотрел на MVVC approachto узнать правильный путь.

0

Вместо создания нового экземпляра класса MainWindow в вашем классе Utilities вы можете ввести класс Utilities ссылкой на уже инициализированный экземпляр класса MainWindow. Вам понадобится ссылка на этот конкретный экземпляр, чтобы иметь возможность включать и отключать любые элементы управления в этом случае. Пожалуйста, обратитесь к следующему образцу кода.

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; 
    } 
} 
Смежные вопросы