2012-12-13 22 views
0

我正在尝试学习如何在Wpf应用程序中调用方法。用户界面上的方法调用意外行为

在基础实验中,我有两页,PageDataMainPage

PageData代码:

namespace AppName 
{ 
    public sealed partial class PageData 
    { 
     public PageData() 
     { 
      this.InitializeComponent(); 
     } 

     // works 
     private void Button_Click_1(object sender, RoutedEventArgs e) 
     { 
      mTest(); 
     } 

     public bool mTest() 
     { 
      var newTbx = new TextBox{ 
       Text = "Hello", 
       FontSize = 50 
       }; 

      Grid.SetRow(newTbx, 3); 
      Grid.SetColumn(newTbx, 3); 
      gridMainPageData.Children.Add(newTbx); 

      return true; 
     } 
    } 
} 

MainPage代码:

namespace AppName 
{ 
    public sealed class MainPage 
    { 
     public MainPage() 
     { 
      InitializeComponent(); 
     } 

     private void pageRoot_Loaded(object sender, RoutedEventArgs e) 
     { 
      PageData passCall = new PageData(); 

      mDisplayAlert(passCall.mTest().ToString()); 
     } 
    } 
} 

似乎mTest()完成,因为我得到了 “真实” 的响应时MainPage负载(我有一个方法mDisplayAlert的方法,我用于在MainPage用户界面上显示消息),但PageData上的用户界面不会更改。我知道mTest()可以工作,因为PageData上的按钮单击事件确实有效。

为什么从MainPage调用UI时不更新?

+0

当你谈论一个'C#/ XAML'应用程序时,你的意思是'Wpf app'吧? – phadaphunk

+0

我指定Windows 8 C#/ XAML而不是WPF,因为在Win RT生态系统中似乎存在一些差异。你显然知道更多,我仍然在学习术语。 – Gary95054

回答

1

由于您在MainPage内部创建PageData的新实例,因此您真正想要执行的操作是使用相同的实例访问完全相同的控件。当您拨打.test()方法时,您会创建一个全新的TextBox,并将数据分配给全新的Grid,当您认为自己正在为您写第一个PageData实例时。

你有很多选择。您可以:

  • 当您创建实例时,将其他形式的参考传递给您。
  • 通过参考PageData实例在两个类之间创建一个事件。
  • 制定您的方法并控制StaticPageData以确保整个程序共享相同的实例。 (根本不推荐)
  • 如果您需要一些解决方法,可以始终将方法设置为Static并创建控件实例的Static副本。然后编译器会要求提供一个Static控件的引用,您可以使用Controls.Find(yourControl)来指定实例副本(也不是一个好的做法)。

就我个人而言,我会使用选项1号,但现在你知道你有选择。