方法调用UI上的意外行为

时间:2012-12-13 05:09:27

标签: c# methods

我正在尝试学习如何在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,我用它来显示{{1}上的消息UI),但MainPage上的用户界面不会改变。我知道PageData有效,因为mTest()上的按钮点击事件确实有效。

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

1 个答案:

答案 0 :(得分:1)

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

你有很多选择。你可以:

  • 创建时,将PageData实例的引用传递给您。
  • 在两个类之间创建一个事件,并引用PageData实例。
  • Static中创建方法和控件PageData,以确保整个程序共享同一个实例。 (根本不推荐)
  • 如果您想稍微解决一下,可以随时将方法设置为Static并创建控件实例的Static副本。然后编译器将要求引用Static控件,您可以使用Controls.Find(yourControl)分配实例副本。(也不是一个好习惯)。

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