WinUI(C#):如何正确实现页面间的数据共享?
WinUI页面间共享设置属性的实现问题
我是WinUI开发新手,正在使用Visual Studio开发一款UI应用,该应用通过含属性的JSON文件与控制台程序交互。UI包含两个主模块和一个设置页面,页面间共享部分需写入JSON文件的属性,我认为NavigationView非常适配需求,且希望避免单窗口架构。这是一款Windows Forms旧应用的重构版本,旧版仅含少量控件与带菜单的主窗口。
已尝试的方案及问题
1. 读取其他页面的属性/变量
- 使用静态对象可行,但需大量手动操作关联控件;
- 同类方案同样需大量手动操作;
- 创建双实例无效,各实例更新相互独立。
2. 绑定控件到静态属性
- 未找到WinUI相关指南,参考其他方案尝试;
- 无论通过XAML或代码后置创建实例并更新,均无法同步源属性;
- 尝试使用非静态属性并跨页创建实例,同样无效(可能操作有误)。
3. 参考StackOverflow相关方案但多数无效
- 某MAUI方案推荐的DependencyService为Xamarin专属,不适配WinUI;
- 大量方案仅适用于Forms、Framework等其他应用类型,无法迁移至WinUI。
4. 尝试MVVM模式
- 仅在同一页面内生效,跨页实例无法同步源属性;
- 前述静态对象方案结合MVVM仍无效;
- 尝试Toolkit MVVM包并模仿Template Studio for WinUI的实现,无改善;
- 了解到可通过Main ViewModel实现ViewModel及页面间数据共享,但不知如何操作及是否可行。
5. 顾虑Template Studio的文件读写方案性能
- Template Studio的主题切换设置会写入独立文件,这是我需避免的(我的UI设置文件需支持文本编辑器修改);
- 文件读写需为每个控件添加命令,效率不如手动关联方案;
- 虽存在绑定INI/XML/JSON等设置文件的方案,但因性能顾虑未深入研究。
6. 其他尝试的方案
- DynamicMethod性能差且无法解决问题;
- 依赖属性性能已改善但因无合适教程无法实现,若为推荐方案可提供无效代码。
代码示例
1. 静态属性需大量手动赋值
Page1 (XAML)
<ToggleSwitch x:Name="test" Header="test switch" OffContent="Off" OnContent="On" Toggled="test_Toggled"/>
Page1 代码后置(C#)
[...] public static MyClass Test { get; set; } [...] private void test_Toggled(object sender, RoutedEventArgs e) { Test.TestSwitch = test.IsOn; } [...]
Page2 代码后置(C#)
using static Namespace.Page1; [...] TextBox.Text = Test.TestSwitch.ToString(); [...]
2. 无法实现正确静态绑定,非静态属性跨页无效
Page1 (XAML)
<ToggleSwitch x:Name="test" Header="test switch" IsOn="{x:Bind Test.TestSwitch, Mode=TwoWay}" OffContent="Off" OnContent="On"/> <TextBox x:Name="test2" Text="{x:Bind Test.TestSwitch, Mode=OneWay}"/> <!--works-->
Page1 代码后置(C#)
[...] public MyClass Test { get; } [...]
Page2 代码后置(C#)
[...] Page1 P1 = new(); TextBox.Text = P1.Test.TestSwitch.ToString(); [...]
现咨询该场景下页面间数据共享的正确实现方式,是否有开发者有相关经验?
内容的提问来源于stack exchange,提问作者ak2yny
相关产品推荐
相关产品推荐

