将字符串写入 C#、UWP 中不同页面上的文本块
write string to textblock on different page in C#, UWP
如何在不同的页面上写入 TextBlock
?
到目前为止,它仅适用于同一页面上的 TextBlocks
。
async
函数在 Page_1
中。 TextBlock
在 Page_2
.
public async void Serial()
{
string rxBuffer;
//code
//code
//code
while (true)
{
textblock_DebugRx_Gas_live.Text = rxBuffer;
}
}
write string to textblock on different page in C#, UWP
如果像下面这样两个页面同时显示在前台
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="1*"/>
<RowDefinition Height="1*"/>
</Grid.RowDefinitions>
<StackPanel Margin="0,20,0,0" HorizontalAlignment="Center">
<Button Click="Button_Click" Content="Click" />
<TextBlock x:Name="Tbk" />
</StackPanel>
<Frame Grid.Row="1" VerticalAlignment="Center">
<local:TestPage />
</Frame>
</Grid>
您可以使用 Messenger
将消息从原始页面发送到目标页面。
using GalaSoft.MvvmLight.Messaging;
private void Button_Click(object sender, RoutedEventArgs e)
{
var message = "Test";
Messenger.Default.Send<string,TestPage>(message);
Tbk.Text = message;
}
目标页面
public TestPage()
{
this.InitializeComponent();
this.Loaded += TestPage_Loaded;
}
private void TestPage_Loaded(object sender, RoutedEventArgs e)
{
Messenger.Default.Register<string>(this, (s) =>
{
MyTextBlock.Text = s;
});
}
通常,页面一次显示一个页面,因此如果您想在导航期间在它们之间传递数据,您应该使用 Frame.Navigate
方法的第二个参数:
this.Frame.Navigate(typeof(SecondPage), someString);
然而,更好的解决方案是使用某种 MVVM 框架,它具有基于 ViewModel 的导航服务,其生命周期比 UI controls/page 更长。 MvvvmCross、MvvmLight、SimpleMvvm 或 Reactive UI 等框架都可以帮助您更轻松地编写此类逻辑。
在您的情况下,您可以将更新后的状态存储在视图模型中,然后由两个页面共享,因此任何更改都会反映在两个地方。与其直接写入 TextBlocks
的 Text
属性,不如使用 string
属性 实现视图模型,这会触发 PropertyChanged
来自 INotifyPropertyChanged
界面的事件。 MVVM 模式在许多教程中都有很好的描述,因此我鼓励您深入研究它。
如何在不同的页面上写入 TextBlock
?
到目前为止,它仅适用于同一页面上的 TextBlocks
。
async
函数在 Page_1
中。 TextBlock
在 Page_2
.
public async void Serial()
{
string rxBuffer;
//code
//code
//code
while (true)
{
textblock_DebugRx_Gas_live.Text = rxBuffer;
}
}
write string to textblock on different page in C#, UWP
如果像下面这样两个页面同时显示在前台
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="1*"/>
<RowDefinition Height="1*"/>
</Grid.RowDefinitions>
<StackPanel Margin="0,20,0,0" HorizontalAlignment="Center">
<Button Click="Button_Click" Content="Click" />
<TextBlock x:Name="Tbk" />
</StackPanel>
<Frame Grid.Row="1" VerticalAlignment="Center">
<local:TestPage />
</Frame>
</Grid>
您可以使用 Messenger
将消息从原始页面发送到目标页面。
using GalaSoft.MvvmLight.Messaging;
private void Button_Click(object sender, RoutedEventArgs e)
{
var message = "Test";
Messenger.Default.Send<string,TestPage>(message);
Tbk.Text = message;
}
目标页面
public TestPage()
{
this.InitializeComponent();
this.Loaded += TestPage_Loaded;
}
private void TestPage_Loaded(object sender, RoutedEventArgs e)
{
Messenger.Default.Register<string>(this, (s) =>
{
MyTextBlock.Text = s;
});
}
通常,页面一次显示一个页面,因此如果您想在导航期间在它们之间传递数据,您应该使用 Frame.Navigate
方法的第二个参数:
this.Frame.Navigate(typeof(SecondPage), someString);
然而,更好的解决方案是使用某种 MVVM 框架,它具有基于 ViewModel 的导航服务,其生命周期比 UI controls/page 更长。 MvvvmCross、MvvmLight、SimpleMvvm 或 Reactive UI 等框架都可以帮助您更轻松地编写此类逻辑。
在您的情况下,您可以将更新后的状态存储在视图模型中,然后由两个页面共享,因此任何更改都会反映在两个地方。与其直接写入 TextBlocks
的 Text
属性,不如使用 string
属性 实现视图模型,这会触发 PropertyChanged
来自 INotifyPropertyChanged
界面的事件。 MVVM 模式在许多教程中都有很好的描述,因此我鼓励您深入研究它。