我正在尝试学习如何在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
加载时得到“真实”响应(我有一个方法mDisplayAlert
,我用它来显示{{1}上的消息UI),但MainPage
上的用户界面不会改变。我知道PageData
有效,因为mTest()
上的按钮点击事件确实有效。
为什么从MainPage调用时UI不会更新?
答案 0 :(得分:1)
因为您在PageData
内创建MainPage
的新实例,而您真正想要做的是使用相同的实例来访问完全相同的控件。当您调用.test()
方法时,您会创建一个全新的TextBox
并在您认为自己正在撰写第一个Grid
实例时将数据分配给全新的PageData
。
你有很多选择。你可以:
PageData
实例的引用传递给您。PageData
实例。Static
中创建方法和控件PageData
,以确保整个程序共享同一个实例。 (根本不推荐)Static
并创建控件实例的Static
副本。然后编译器将要求引用Static
控件,您可以使用Controls.Find(yourControl)
分配实例副本。(也不是一个好习惯)。就我个人而言,我会使用1号选项,但现在你知道你可以选择。