21

我想知道如何从 C# Windows Store 应用程序中的不同类访问主页的当前实例。

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

创建一个新实例可以工作,如下所示:

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

因为它公开了方法/ UI 元素,但这不是正确的过程。

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

4

3 回答 3

50

我同意最好使用 MVVM 模式,但以防万一您需要获取当前页面,您可以按如下方式进行:

  var frame = (Frame)Window.Current.Content;
  var page = (MainPage)frame.Content;
于 2013-07-09T19:58:48.400 回答
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 或通知您的 View:

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

挺容易... :)

于 2013-07-10T13:59:50.330 回答
-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();
于 2013-07-09T19:33:41.723 回答