0

我正在尝试学习如何在整个Wpf应用程序中调用方法。

在一个基本实验中,我有两个页面,PageData并且MainPage.

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加载时我得到了“真实”响应(我有一个用于在 UImDisplayAlert上显示消息的方法MainPage),但 UI 上的PageData并没有改变。我知道这很mTest()有效,因为按钮单击事件PageData确实有效。

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

4

1 回答 1

1

因为当你真正想做的是使用同一个实例来访问完全相同的控件时,你创建了一个PageData内部的新实例。MainPage当您调用该.test()方法时,您会创建一个全新的TextBox并将数据分配给一个全新的Grid,当您认为您正在编写您的第一个PageData实例时。

从那里你有很多选择。你可以 :

  • 创建实例时,将实例的引用传递PageData给其他表单。
  • PageData使用对实例的引用在两个类之间创建一个事件。
  • 加入你的方法和控件StaticPageData以确保整个程序共享同一个实例。(完全不推荐)
  • 如果您想解决一些问题,您始终可以将您的方法设置为Static并创建Static控件实例的副本。然后编译器会询问控件的引用,您可以使用.(也不是一个好习惯)Static分配实例副本。Controls.Find(yourControl)

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

于 2012-12-13T05:18:18.663 回答