Можете ли вы вызвать функцию в MainWindow.Xaml.cs из App.Xaml.cs?

#c# #wpf #method-call

#c# #wpf #метод-вызов

Вопрос:

Это кажется выполнимым, но по какой-то причине правильный способ мне не приходит в голову. Я новичок в C # и .NET, поэтому надеюсь, что это не смешной вопрос 🙂

Комментарии:

1. Я думаю, что просмотр части вашего кода (даже если он не работает) поможет дать релевантный ответ.

2. Иногда статические методы или свойства могут удовлетворить ваши потребности. msdn.microsoft.com/en-us/library/79b3xss3 (VS.80).aspx

Ответ №1:

Не уверен, зачем вам это нужно. Это не похоже на лучший дизайн, но, не зная деталей того, что вы делаете, я не могу это комментировать. Вот как это можно сделать:

В App.Xaml.cs:

 var main = App.Current.MainWindow as MainWindow; // If not a static method, this.MainWindow would work
main.MyFunction();
  

Обратите внимание, что вам придется сделать это после запуска. Если вы хотите сделать это перед запуском, вам нужно будет создать MainWindow объект и назначить его this.MainWindow :

 var window = new MainWindow();
this.MainWindow = window;

window.Show();

window.MyFunction();
  

Комментарии:

1. спасибо за помощь. Я действительно хотел использовать метод во время запуска для установки значений.

2. После этого вы можете продолжить и очистить StartupUri свойство из файла App.xaml. Эти строки кода переопределяют ее.

Ответ №2:

Приятно видеть, что кто-то начинает! Продолжайте в том же духе, вы обнаружите, что язык является мощным, и в конечном итоге вы увидите методологии проектирования, которые они предполагают использовать при написании кода.

Я могу назвать только несколько обстоятельств, при которых вы могли бы захотеть сделать такую вещь.

1) Вызов некоторой функции, независимой от окна:

Если ваш код не зависит от вашего MainWindow и не ссылается на него, может быть, вам следует переместить его из файла кода MainWindow и поместить куда-нибудь еще? У вас может быть столько cs-файлов, сколько вы хотите, поэтому не торопитесь и все упорядочивайте. Позже вы будете рады, что сделали это.

2) Выполнение некоторой задачи инициализации в окне после его загрузки:

В коде вашего окна вставьте свой код после вызова InitializeComponent() в конструкторе. (Это метод, у которого нет возвращаемого типа, это просто «public MainWindow() {«

Помните, что вы можете добавлять параметры в свой конструктор, когда вам нужно что-то передать. В конструкторе без параметров по умолчанию, который создает Visual Studio, нет ничего волшебного. Возможно, таким образом вам удастся избежать создания большого количества запутанного кода. Обычно лучше выполнять инициализацию в коде окна, а не загружать само окно,

3) Получение некоторых простых данных в окне или из него

Вы уже научились создавать пользовательские свойства? Это действительно просто.

Комментарии:

1. спасибо за совет! Никакие 2 и 3 не имеют отношения к делу, и ваш совет очень полезен в решении моей проблемы. В итоге я фактически перенес некоторый код из моего MainWindow в App.cs, чтобы это сделать. У меня есть несколько экземпляров MainWindow, поэтому отдельные свойства не помогли, однако я выяснил, что могу использовать свойство коллекции строк. Я превращаю значения каждого экземпляра в одну строку и использую коллекцию для хранения и извлечения во время запуска и завершения работы. Я ценю помощь, Ники