Лучший способ получить доступ к текущему экземпляру 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();