C# UWP 10 C.将文本文件读入列表 让我先说我对UWP是全新的,我最接近这门语言的是12年前的C++。p>
我正在为Windows Universal编写一个应用程序,在其中我将逐行读取不同的文本文件,拆分每行的内容一些文件我不需要拆分行,将数据添加到列表中,然后在屏幕上显示。我已经尝试了很多方法来做这件事,但我没有让它正常工作。我目前有两种方法是有效的,但并不一致。它将显示数据,但只是有时显示。当我在emulator或本地设备上运行应用程序时,它可能会显示数据,也可能不会显示数据,然后如果我单击其他页面并返回列表页面,它可能会再次显示数据,也可能不会再次显示数据 这是密码。。在本例中,我将文本文件的内容拆分为3个字符串,在“-”上拆分 在我的XAML.cs文件中C# UWP 10 C.将文本文件读入列表 让我先说我对UWP是全新的,我最接近这门语言的是12年前的C++。p>,c#,win-universal-app,C#,Win Universal App,我正在为Windows Universal编写一个应用程序,在其中我将逐行读取不同的文本文件,拆分每行的内容一些文件我不需要拆分行,将数据添加到列表中,然后在屏幕上显示。我已经尝试了很多方法来做这件事,但我没有让它正常工作。我目前有两种方法是有效的,但并不一致。它将显示数据,但只是有时显示。当我在emulator或本地设备上运行应用程序时,它可能会显示数据,也可能不会显示数据,然后如果我单击其他页面并返回列表页面,它可能会再次显示数据,也可能不会再次显示数据 这是密码。。在本例中,我将文本文件的
public sealed partial class SPList : Page
{
private List<ThreeColumnList> ThreeColumnLists;
public SPList()
{
this.InitializeComponent();
ThreeColumnLists = ThreeColumnListManager.GetList();
}
}
在我的三列列表manager.cs中
class ThreeColumnListManager
{
public static List<ThreeColumnList> GetList()
{
var threecolumnlists = new List<ThreeColumnList>();
//Add a dummy row to present something on screen
threecolumnlists.Add(new ThreeColumnList { Name = "Name1", Age = "Age1", Job = "Job1" });
//First working method
readList(threecolumnlists);
//Second Working Method
//tryAgain(threecolumnlists);
return threecolumnlists;
}
public static async void readList(List<ThreeColumnList> tcl)
{
List<ThreeColumnList> a = tcl;
string _line;
var file = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///Lists/splist.txt"));
using (var inputStream = await file.OpenReadAsync())
using (var classicStream = inputStream.AsStreamForRead())
using (var streamReader = new StreamReader(classicStream))
{
while (streamReader.Peek() >= 0)
{
Debug.WriteLine("Line");
_line = streamReader.ReadLine();
//Debug.WriteLine(string.Format("the line is {0}", _line ));
string _first = "" + _line.Split('-')[0];
string _second = "" + _line.Split('-')[1];
string _third = "" + _line.Split('-')[2];
a.Add(new ThreeColumnList { Name = _first, Age = _second, Job = _third });
}
}
}
public static async void tryAgain(List<ThreeColumnList> tcl)
{
//Loading Folder
var _folder = Windows.ApplicationModel.Package.Current.InstalledLocation;
_folder = await _folder.GetFolderAsync("Lists");
//Get the file
var _file = await _folder.GetFileAsync("splist.txt");
// read content
IList<string> _ReadLines = await Windows.Storage.FileIO.ReadLinesAsync(_file);
int i = 0;
foreach (var _line in _ReadLines)
{
i++;
string _first = "" + _line.Split('-')[0];
string _second = "" + _line.Split('-')[1];
string _third = "" + _line.Split('-')[2];
tcl.Add(new ThreeColumnList { Name = _first, Age = _second, Job = _third });
}
Debug.WriteLine("Count is " + i);
}
}
排队!是一个分隔行,但它仍将显示!在屏幕上拆分后显示-
起初,我试图获取文件的内容并将其返回到GetList,然后将内容处理到列表中,但我没有运气
然后我决定尝试将列表传递给获取内容并填充列表的方法
我拥有的两个功能都会在屏幕上显示内容,但并不一致。ReadList似乎比tryAgain工作得更频繁,但它仍然不能每次都工作
另外,请注意,我尝试过这样做,我没有拆分文件每一行的内容,我看到了同样的问题,它只是偶尔加载
。一旦我完成了这项工作,我就开始阅读文件
我有一种感觉,我真的很接近,但我不确定
有人对我的错误有什么建议吗
谢谢 在这里用四肢行走,但是:
异步操作意味着它可以在不同的线程上运行,因此读取文件的最终结果可能是三列列表位于不同的线程上。您是否收到或已抑制加载文件期间或加载后不久发生的异常?如果所有者线程不是UI线程来避免这个问题,您可能会考虑双重检查,即在绑定发生之前将列表编组到UI线程。 此处,但是: 异步操作意味着它可以在不同的线程上运行,因此读取文件的最终结果可能是三列列表位于不同的线程上。您是否收到或已抑制加载文件期间或加载后不久发生的异常?如果所有者线程不是UI线程来避免这个问题,您可能会考虑双重检查,即绑定之前将列表编组到UI线程。 您必须等待或等待任务。 更改签名 公共静态异步void readListList tcl 到 公共静态异步任务readListList tcl 然后像ReadListThreeColumnList一样调用它 这会破坏代码的异步性,但会起作用。 最好的方法是将GetList更改为异步,并在向用户显示微调器或进度条的任务中运行此任务:
public SPList()
{
this.InitializeComponent();
Task.Run(async () =>
{
IsLoading = true;
ThreeColumnLists = await ThreeColumnListManager.GetList();
IsLoading = false;
}
}
private bool _isLoading;
public bool IsLoading
{
get { return _isLoading; }
set
{
if(_isLoading != value)
{
_isLoading = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(IsLoading));
}
}
}
你必须等待或等待任务
更改签名
公共静态异步void readListList tcl
到
公共静态异步任务readListList tcl
然后像ReadListThreeColumnList一样调用它
这会破坏代码的异步性,但会起作用。
最好的方法是将GetList更改为异步,并在向用户显示微调器或进度条的任务中运行此任务:
public SPList()
{
this.InitializeComponent();
Task.Run(async () =>
{
IsLoading = true;
ThreeColumnLists = await ThreeColumnListManager.GetList();
IsLoading = false;
}
}
private bool _isLoading;
public bool IsLoading
{
get { return _isLoading; }
set
{
if(_isLoading != value)
{
_isLoading = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(IsLoading));
}
}
}
尝试实现INotifyPropertyChanged和ObservableCollection接口,这些接口用于通知客户端(通常是绑定客户端)属性值已更改 还可以使用Task加载数据 编辑: MainPage.cs.xaml
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Diagnostics;
using System.IO;
using System.Net.Http;
using System.Net.Sockets;
using System.Threading.Tasks;
using Windows.Foundation.Collections;
using Windows.Storage;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
namespace TestUWP
{
/// <summary>
/// An empty page that can be used on its own or navigated to within a Frame.
/// </summary>
public sealed partial class MainPage : Page
{
private ObservableCollection<ThreeColumnList> threeColumnLists;
public ObservableCollection<ThreeColumnList> ThreeColumnLists
{
get { return threeColumnLists ?? (threeColumnLists = new ObservableCollection<ThreeColumnList>()); }
set { threeColumnLists = value; }
}
public MainPage()
{
this.InitializeComponent();
LoadData();
}
private async void LoadData()
{
//you can also change the private threeColumnLists to a static
// and do
//if(ThreeColumnLists.Count==0)
// ThreeColumnLists = await ThreeColumnListManager.GetListAsync();
ThreeColumnLists = await ThreeColumnListManager.GetListAsync();
//can also do
// await ThreeColumnListManager.readList(ThreeColumnLists);
}
}
public class ThreeColumnList : INotifyPropertyChanged
{
private string name = string.Empty;
public string Name { get { return name; } set { name = value; NotifyPropertyChanged("Name"); } }
private string age = string.Empty;
public string Age { get { return age; } set { age = value; NotifyPropertyChanged("Age"); } }
private string job = string.Empty;
public string Job { get { return job; } set { job = value; NotifyPropertyChanged("Job"); } }
//PropertyChanged handers
public event PropertyChangedEventHandler PropertyChanged;
public void NotifyPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this,
new PropertyChangedEventArgs(propertyName));
}
}
}
public class ThreeColumnListManager
{
public static async Task<ObservableCollection<ThreeColumnList>> GetListAsync()
{
var threecolumnlists = new ObservableCollection<ThreeColumnList>();
//Add a dummy row to present something on screen
threecolumnlists.Add(new ThreeColumnList { Name = "Name1", Age = "Age1", Job = "Job1" });
//First working method
await readList(threecolumnlists);
//Second Working Method
//tryAgain(threecolumnlists);
return threecolumnlists;
}
public static async Task readList(ObservableCollection<ThreeColumnList> tcl)
{
string _line;
var file = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///Lists/slplist.txt"));
using (var inputStream = await file.OpenReadAsync())
using (var classicStream = inputStream.AsStreamForRead())
using (var streamReader = new StreamReader(classicStream))
{
while (streamReader.Peek() >= 0)
{
Debug.WriteLine("Line");
_line = streamReader.ReadLine();
//Debug.WriteLine(string.Format("the line is {0}", _line ));
string _first = "" + _line.Split('-')[0];
string _second = "" + _line.Split('-')[1];
string _third = "" + _line.Split('-')[2];
tcl.Add(new ThreeColumnList { Name = _first, Age = _second, Job = _third });
}
}
}
public static async Task tryAgain(ObservableCollection<ThreeColumnList> tcl)
{
//Loading Folder
var _folder = Windows.ApplicationModel.Package.Current.InstalledLocation;
_folder = await _folder.GetFolderAsync("Lists");
//Get the file
var _file = await _folder.GetFileAsync("splist.txt");
// read content
IList<string> _ReadLines = await Windows.Storage.FileIO.ReadLinesAsync(_file);
int i = 0;
foreach (var _line in _ReadLines)
{
i++;
string _first = "" + _line.Split('-')[0];
string _second = "" + _line.Split('-')[1];
string _third = "" + _line.Split('-')[2];
tcl.Add(new ThreeColumnList { Name = _first, Age = _second, Job = _third });
}
Debug.WriteLine("Count is " + i);
}
}
}
MainPage.xaml
<Page
x:Class="TestUWP.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:TestUWP"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<Page.Resources>
<!-- x:DataType="<Name Of Class>" -->
<DataTemplate x:Key="ThreeColumnListDataTemplate" x:DataType="local:ThreeColumnList">
<StackPanel Orientation="Horizontal" HorizontalAlignment="Left">
<TextBlock Grid.Column="0" Text="{x:Bind Name}" HorizontalAlignment="Left" FontSize="16" Margin="20,20,20,20" />
<TextBlock Grid.Column="1" Text="{x:Bind Age}" HorizontalAlignment="Left" FontSize="16" Margin="20,20,20,20" />
<TextBlock Grid.Column="2" Text="{x:Bind Job}" HorizontalAlignment="Right" FontSize="16" Margin="20,20,20,20" />
</StackPanel>
</DataTemplate>
</Page.Resources>
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="100" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="2*" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBlock Grid.Row="1"
Name="ResultTextBlock"
FontSize="24"
Foreground="Red"
FontWeight="Bold"
Margin="20,20,0,0" />
<!-- ItemsSource="x:Bind <Variable from the CS(Code) Class> -->
<ListView Grid.ColumnSpan="3" ItemsSource="{x:Bind ThreeColumnLists}"
ItemTemplate="{StaticResource ThreeColumnListDataTemplate}">
</ListView>
</Grid>
输出:
尝试实现INotifyPropertyChanged和ObservableCollection接口,这些接口用于通知客户端(通常是绑定客户端)属性值已更改 还可以使用Task加载数据 编辑: MainPage.cs.xaml
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Diagnostics;
using System.IO;
using System.Net.Http;
using System.Net.Sockets;
using System.Threading.Tasks;
using Windows.Foundation.Collections;
using Windows.Storage;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
namespace TestUWP
{
/// <summary>
/// An empty page that can be used on its own or navigated to within a Frame.
/// </summary>
public sealed partial class MainPage : Page
{
private ObservableCollection<ThreeColumnList> threeColumnLists;
public ObservableCollection<ThreeColumnList> ThreeColumnLists
{
get { return threeColumnLists ?? (threeColumnLists = new ObservableCollection<ThreeColumnList>()); }
set { threeColumnLists = value; }
}
public MainPage()
{
this.InitializeComponent();
LoadData();
}
private async void LoadData()
{
//you can also change the private threeColumnLists to a static
// and do
//if(ThreeColumnLists.Count==0)
// ThreeColumnLists = await ThreeColumnListManager.GetListAsync();
ThreeColumnLists = await ThreeColumnListManager.GetListAsync();
//can also do
// await ThreeColumnListManager.readList(ThreeColumnLists);
}
}
public class ThreeColumnList : INotifyPropertyChanged
{
private string name = string.Empty;
public string Name { get { return name; } set { name = value; NotifyPropertyChanged("Name"); } }
private string age = string.Empty;
public string Age { get { return age; } set { age = value; NotifyPropertyChanged("Age"); } }
private string job = string.Empty;
public string Job { get { return job; } set { job = value; NotifyPropertyChanged("Job"); } }
//PropertyChanged handers
public event PropertyChangedEventHandler PropertyChanged;
public void NotifyPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this,
new PropertyChangedEventArgs(propertyName));
}
}
}
public class ThreeColumnListManager
{
public static async Task<ObservableCollection<ThreeColumnList>> GetListAsync()
{
var threecolumnlists = new ObservableCollection<ThreeColumnList>();
//Add a dummy row to present something on screen
threecolumnlists.Add(new ThreeColumnList { Name = "Name1", Age = "Age1", Job = "Job1" });
//First working method
await readList(threecolumnlists);
//Second Working Method
//tryAgain(threecolumnlists);
return threecolumnlists;
}
public static async Task readList(ObservableCollection<ThreeColumnList> tcl)
{
string _line;
var file = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///Lists/slplist.txt"));
using (var inputStream = await file.OpenReadAsync())
using (var classicStream = inputStream.AsStreamForRead())
using (var streamReader = new StreamReader(classicStream))
{
while (streamReader.Peek() >= 0)
{
Debug.WriteLine("Line");
_line = streamReader.ReadLine();
//Debug.WriteLine(string.Format("the line is {0}", _line ));
string _first = "" + _line.Split('-')[0];
string _second = "" + _line.Split('-')[1];
string _third = "" + _line.Split('-')[2];
tcl.Add(new ThreeColumnList { Name = _first, Age = _second, Job = _third });
}
}
}
public static async Task tryAgain(ObservableCollection<ThreeColumnList> tcl)
{
//Loading Folder
var _folder = Windows.ApplicationModel.Package.Current.InstalledLocation;
_folder = await _folder.GetFolderAsync("Lists");
//Get the file
var _file = await _folder.GetFileAsync("splist.txt");
// read content
IList<string> _ReadLines = await Windows.Storage.FileIO.ReadLinesAsync(_file);
int i = 0;
foreach (var _line in _ReadLines)
{
i++;
string _first = "" + _line.Split('-')[0];
string _second = "" + _line.Split('-')[1];
string _third = "" + _line.Split('-')[2];
tcl.Add(new ThreeColumnList { Name = _first, Age = _second, Job = _third });
}
Debug.WriteLine("Count is " + i);
}
}
}
MainPage.xaml
<Page
x:Class="TestUWP.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:TestUWP"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<Page.Resources>
<!-- x:DataType="<Name Of Class>" -->
<DataTemplate x:Key="ThreeColumnListDataTemplate" x:DataType="local:ThreeColumnList">
<StackPanel Orientation="Horizontal" HorizontalAlignment="Left">
<TextBlock Grid.Column="0" Text="{x:Bind Name}" HorizontalAlignment="Left" FontSize="16" Margin="20,20,20,20" />
<TextBlock Grid.Column="1" Text="{x:Bind Age}" HorizontalAlignment="Left" FontSize="16" Margin="20,20,20,20" />
<TextBlock Grid.Column="2" Text="{x:Bind Job}" HorizontalAlignment="Right" FontSize="16" Margin="20,20,20,20" />
</StackPanel>
</DataTemplate>
</Page.Resources>
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="100" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="2*" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBlock Grid.Row="1"
Name="ResultTextBlock"
FontSize="24"
Foreground="Red"
FontWeight="Bold"
Margin="20,20,0,0" />
<!-- ItemsSource="x:Bind <Variable from the CS(Code) Class> -->
<ListView Grid.ColumnSpan="3" ItemsSource="{x:Bind ThreeColumnLists}"
ItemTemplate="{StaticResource ThreeColumnListDataTemplate}">
</ListView>
</Grid>
输出:
可以显示输入文件的一部分吗?@sybren抱歉,可以!我本来想补充的!我现在用一个样本更新了这篇文章。我也尝试过这样做,我没有分割文件中的每一行,我只使用了一列,并且我得到了相同的结果,它只是有时起作用。该文本文件中的数据与任何包含新行的文本文件一样。谢谢我调试了你的代码,效果很好。我相信在代码方面你很好。让我担心的是xaml部分。如何显示数据??你能添加xaml部分以及如何在元素中传递数据吗?@Stamos我现在用我的xaml更新了post,也用了我下面实现列表的教程。一旦我开始工作,我就开始阅读pa文件
是否可以显示输入文件的一部分?@sybren抱歉,是的!我本来想补充的!我现在用一个样本更新了这篇文章。我也尝试过这样做,我没有分割文件中的每一行,我只使用了一列,并且我得到了相同的结果,它只是有时起作用。该文本文件中的数据与任何包含新行的文本文件一样。谢谢我调试了你的代码,效果很好。我相信在代码方面你很好。让我担心的是xaml部分。如何显示数据??你能添加xaml部分以及如何在元素中传递数据吗?@Stamos我现在用我的xaml更新了post,也用了我下面实现列表的教程。一旦我开始工作,我就开始从文件中读入部分谢谢。首先,我尝试了.Wait方法。当我尝试在这次更改后运行应用程序时,一旦我单击按钮加载文件,它就会挂起。然后,我按照您的建议更改了GetList,这样做会更好。但它仍然不是每次都加载。它将成功加载约80%的时间,这是一个巨大的改进。PropertyChanged?.Invokethis,新的PropertyChangedEventArgsnameofIsLoading;是否在我的代码中显示PropertyChanged上的异常?所以现在我已经把这个评论掉了。你知道为什么每次都不管用吗??谢谢另外,我刚刚注意到,当数据没有完全加载时,它甚至没有显示编码到屏幕列表中的虚拟行。所以它几乎就像现在它似乎有问题的列表,但不是文本文件!。。。要使PropertyChanged正常工作,您的类需要实现INotifyPropertyChanged接口。谢谢。首先,我尝试了.Wait方法。当我尝试在这次更改后运行应用程序时,一旦我单击按钮加载文件,它就会挂起。然后,我按照您的建议更改了GetList,这样做会更好。但它仍然不是每次都加载。它将成功加载约80%的时间,这是一个巨大的改进。PropertyChanged?.Invokethis,新的PropertyChangedEventArgsnameofIsLoading;是否在我的代码中显示PropertyChanged上的异常?所以现在我已经把这个评论掉了。你知道为什么每次都不管用吗??谢谢另外,我刚刚注意到,当数据没有完全加载时,它甚至没有显示编码到屏幕列表中的虚拟行。所以它几乎就像现在它似乎有问题的列表,但不是文本文件!。。。要使PropertyChanged正常工作,您的类需要实现INotifyPropertyChanged接口。谢谢,但如果您能提供帮助,我会遇到一些问题。起初,我在SPList.xaml.cs文件中遇到了问题,但我在网上找到了一个解决方案,将public observeCollection ThreeColumnLists更改为private。这解决了这个问题。然后我在XAML中遇到了一个问题,但这是因为我在以前的代码中使用了不同的列表名称,所以我将其更新为指向三列列表。更改后,我可以构建并运行,但当我点击页面加载列表时,应用程序崩溃。这表明它在尝试加载新页面时找不到SPList。有什么想法吗?不要将public ObservableCollection ThreeColumnList更改为private。请确保xmlns:data=using:TrackingAssistant.Model和指向正确的位置。我在输出中添加了完整的解决方案。请检查此项,找出您的错误所在。谢谢!我用这段代码创建了一个新项目,我可以看到每次我用这段代码编译时,它都会完美地加载到列表中。然后我添加了第二个页面,并更改了App.xaml.cs以首先加载新页面。这个页面上只有一个按钮,所以我可以导航到列表页面。我还向列表页面添加了返回新页面的按钮,现在我发现当我加载并在页面之间单击时,大约80%的时间会加载列表。其他时候,它只是加载一个空白页。有什么原因不能每次加载吗?我开始怀疑它是否与仿真器相关。您是否在txt文件中添加或删除行??如果是,您正在从另一个应用程序的应用程序中执行??。如果没有更改私有可观察集合的三列列表;私有静态ObservableCollection三列列表;只需取消注释代码中的行,并注释ThreeColumnLists=await ThreeColumnListManager.GetListAsync;这样,它将加载列表一次并将其保存在内存中,每次您导航到该页面时,列表都会在那里。谢谢,但如果您能提供帮助,我会遇到问题。起初,我在SPList.xaml.cs文件中遇到了问题,但我在网上找到了一个解决方案,将public observeCollection ThreeColumnLists更改为private。这解决了这个问题。然后我在XAML中遇到了一个问题,但这是因为我在以前的代码中使用了不同的列表名称,所以我将其更新为指向三列列表。更改后,我可以构建并运行,但当我点击页面加载列表时,应用程序崩溃。这表明,当它尝试加载新的p时,无法找到SPList
年龄。有什么想法吗?不要将公共可观察集合三列列表更改为私人。请确保xmlns:data=using:TrackingAssistant.Model和指向正确的位置。我在输出中添加了完整的解决方案。请检查此项,找出您的错误所在。谢谢!我用这段代码创建了一个新项目,我可以看到每次我用这段代码编译时,它都会完美地加载到列表中。然后我添加了第二个页面,并更改了App.xaml.cs以首先加载新页面。这个页面上只有一个按钮,所以我可以导航到列表页面。我还向列表页面添加了返回新页面的按钮,现在我发现当我加载并在页面之间单击时,大约80%的时间会加载列表。其他时候,它只是加载一个空白页。有什么原因不能每次加载吗?我开始怀疑它是否与仿真器相关。您是否在txt文件中添加或删除行??如果是,您正在从另一个应用程序的应用程序中执行??。如果没有更改私有可观察集合的三列列表;私有静态ObservableCollection三列列表;只需取消注释代码中的行,并注释ThreeColumnLists=await ThreeColumnListManager.GetListAsync;这样,它将加载列表一次,并将其保存在内存中,每次您导航到页面时,列表都会出现在那里