Лучший способ получить доступ к текущему экземпляру MainPage в приложении Windows Store?
Мне было интересно, как можно получить доступ к текущему экземпляру главной страницы из другого класса в приложении С# для Windows Store.
В частности, в приложении Windows Store для планшета Surface RT (поэтому, ограниченном RT API) я хочу получить доступ к основным методам и элементам пользовательского интерфейса из других классов.
Создается новый экземпляр, например:
MainPage mp = new MainPage();
mp.PublicMainPageMethod();
mp.mainpageTextBlock.Text = "Setting text at runtime";
поскольку он предоставляет методы/элементы UI, но это не может быть надлежащей процедурой.
Какова наилучшая практика для доступа к методам и изменения элементов пользовательского интерфейса на главной странице во время выполнения, из других классов? Об этом для Windows Phone есть несколько статей, но я не могу найти ничего для Windows RT.
Ответы
Ответ 1
Если вы используете MVVM, вы можете использовать класс Messenger:
MainWindow.xaml:
using GalaSoft.MvvmLight.Messaging;
public MainWindow()
{
InitializeComponent();
this.DataContext = new MainViewModel();
Messenger.Default.Register<NotificationMessage>(this, (nm) =>
{
//Check which message you've sent
if (nm.Notification == "CloseWindowsBoundToMe")
{
//If the DataContext is the same ViewModel where you've called the Messenger
if (nm.Sender == this.DataContext)
//Do something here, for example call a function. I'm closing the view:
this.Close();
}
});
}
И в вашей ViewModel вы можете вызвать Messenger или уведомить об этом в любое время:
Messenger.Default.Send<NotificationMessage>(new NotificationMessage(this, "CloseWindowsBoundToMe"));
довольно легко...:)
Ответ 2
Я согласен, что лучше использовать шаблон MVVM, но на всякий случай вам нужно получить текущую страницу, вы можете сделать это следующим образом:
var frame = (Frame)Window.Current.Content;
var page = (MainPage)frame.Content;
Ответ 3
Я предпочитаю делегат/событие, так что у вас нет прямого доступа к классу.
public MainWindow()
{
StartWindowUserControl.newBla += StartWindowUserControl_newBla;
private void StartWindowUserControl_newBla()
{
и
public partial class StartWindowUserControl : UserControl
{
public delegate void newBlaDelegate();
public static event newBlaDelegate newBla;
MethodA()
{
new();