在Windows Store应用程序中访问当前MainPage实例的最佳方法是什么?

22

我在想如何从C# Windows Store应用的其他类中访问主页面的当前实例。

具体来说,在面向Surface RT平板电脑的Windows Store应用程序中(因此,仅限于RT API),我希望从其他类中访问主页面的方法和UI元素。

创建一个新实例是可行的,像这样:

MainPage mp = new MainPage();
mp.PublicMainPageMethod();
mp.mainpageTextBlock.Text = "Setting text at runtime";

它展示了方法/用户界面元素,但这不是正确的程序。

从其他类在运行时访问主页面的方法并修改用户界面元素的最佳实践是什么?有几篇关于Windows Phone的文章,但我似乎找不到任何关于Windows RT的内容。


1
我会说最好的做法是不要那样做。最佳实践是使用诸如MVVM这样的模式,将您可能想呼叫的内容从UI中分离出来。http://en.wikipedia.org/wiki/Model_View_ViewModel - dkackman
1
我同意使用MVVM模式。至少,您可以在类上创建事件,否则会更新主窗体。让您的主窗体订阅这些事件,并允许它根据事件响应自己的UI。 - Curtis Rutland
3个回答

51

我同意使用MVVM模式更好,但是如果你需要获取当前页面,可以按照以下方式进行:

  var frame = (Frame)Window.Current.Content;
  var page = (MainPage)frame.Content;

4
天啊,我一直想知道如何做到这一点。您是一个冠军和绅士。非常感谢您。 - MartinJH

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

在您的视图模型中,您可以随时调用Messenger或通知您的视图:

Messenger.Default.Send<NotificationMessage>(new NotificationMessage(this, "CloseWindowsBoundToMe"));

相当容易... :)

-1

我更喜欢使用委托/事件,这样你就无法直接访问类。

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

1
当我看到一个类型为Action的事件时,我立刻知道它的签名是什么。它是一个无参数的void方法。当我看到一个newBlaDelegate类型的事件时,我不知道签名是什么;我必须去查找它。此外,尽可能使用Action/Func使得更容易自由地传递委托并在具有正确签名的情况下互换使用,而不必担心在签名完全匹配时从一个委托转换到另一个委托。 - Servy
但是newBlaDelegate最好也有一个参数,而且如果你有自己的Delegate,你可以将其用作库,在不同的包中“捕获”它,使你的类更具适应性。 - Master117
嗯,我想你是对的,我的意思是这就是为什么有Action的原因,但是如果你有很多委托怎么办? - Master117
你的意思是,你不应该有很多委托;这就是我的观点。你应该只是重复使用Action/Func。如果你指的是很多实例中的一个,那么为什么它比自定义委托更难处理呢? - Servy
Action<FirstType> Action<SecontType> Action<ThirdType> - Servy
显示剩余11条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接