C# UWP - 如何从另一个页面访问页面控件?

3

有没有办法从另一个页面访问页面控件。我在我的MainPage中有一些控件,我想从包含列表视图的另一个页面访问Mainpage控件TitleTextBlock。当选择列表视图项时,我想更改Mainpage TitleTextBlock.Text

我也尝试过但是TitleTextBlock.Text值没有改变。那么有什么办法吗??

MainPage.xaml.cs

public void ChangeTitle(string title)
{
   TitleTextBlock.Text = title;
   BackButton.Visibility = Visibility.Visible;
}

ContentPage.xaml.cs

private void ListView_ItemClick(object sender, ItemClickEventArgs e)
{
   var link = (Link)e.ClickedItem;
   this.Frame.Navigate(typeof(WebViewPage), link);

   MainPage p = new MainPage();
   p.ChangeTitle(link.Title);
}

更新 我通过几个更改解决了这个问题 MainPage.xaml.cs

 public static TextBlock HeaderTitleTextBlock { get; set; }
 public static Button HeaderBackButton { get; set; }

 public MainPage()
   {
      this.InitializeComponent();
      HeaderTitleTextBlock = TitleTextBlock;
      HeaderBackButton = BackButton;

   }

ContentPage.xaml.cs

MainPage.HeaderTitleTextBlock.Text = link.Title;
MainPage.HeaderBackButton.Visibility = Visibility.Visible;

1
你没有在现有窗口上工作,也就是说,你正在创建 MainPage 的新实例并对其进行操作,这不会影响当前打开的 MainPage,你需要传递已经实例化的 MainPage 的引用并对其进行操作。 - shashikant_
考虑使用视图模型(view model)。 - rene
你能详细解释一下吗? - shashikant_ - AH Rasel
WPF及其后续的UWP是专门为MVVM模式设计的。虽然您可以应用旧技术,但这些技术只能发挥其能力的约90%。如果您使用MVVM,则不存在问题:您当前显示的视图模型的哪个部分不会改变整个内容都在内存中的事实。如果您需要该模式的简短介绍,我几年前写了一些东西:https://social.msdn.microsoft.com/Forums/vstudio/en-US/b1a8bf14-4acd-4d77-9df8-bdb95b02dbe2/lets-talk-about-mvvm?forum=wpf - Christopher
2个回答

8

你还可以使用x:FieldModifier属性将控件显示为public(这是WPF的默认行为):

<TextBlock x:FieldModifier="public" x:Name="MyTextBlock" />

这将使控件公开,并可从其他类访问。 我已经写了一篇简短的博客文章来说明这个问题: http://blog.mzikmund.com/2017/06/modifying-xaml-field-visibility/

0

我使用过的:

Frame contentFrame = Window.Current.Content as Frame;
MainPage mp =  contentFrame.Content as MainPage;
Grid grid = mp.Content as Grid;
TextBlock my_textblock = grid.FindName("my_textblock") as TextBlock;

my_textblock.Text = "Edited the TextBlock";

当然,Frame>Page>Grid>TextBlock 的层次结构是我在我的 UWP 应用程序中使用的。 希望这可以帮到你。


这比使用字段/属性不太方便,因为查找名称更慢,一旦更改层次结构,它就会中断。 - Martin Zikmund
我在我的回答中使用的方法,甚至更好的方法是创建一个只读属性,以便提供对命名字段的访问(这样外部用户就无法篡改它)。 - Martin Zikmund

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接