C# 在运行期间从txt文件更新文本框,无需单击;刷新“;
在wpf中,我有一个文本框,它的内容来自一个txt文件 在代码behine中,它看起来像:C# 在运行期间从txt文件更新文本框,无需单击;刷新“;,c#,wpf,xaml,C#,Wpf,Xaml,在wpf中,我有一个文本框,它的内容来自一个txt文件 在代码behine中,它看起来像: public MyWindow() { InitializeComponent(); ReadFromTxt(); } void Refresh(object sender, RoutedEventArgs e) { ReadFromTxt(); } void ReadFromTxt() { string[] lines = System.IO.File.ReadAllL
public MyWindow()
{
InitializeComponent();
ReadFromTxt();
}
void Refresh(object sender, RoutedEventArgs e)
{
ReadFromTxt();
}
void ReadFromTxt()
{
string[] lines = System.IO.File.ReadAllLines(@"D:\Log.txt");
foreach (string line in lines)
{
MyTextBox.AppendText(line + Environment.NewLine);
}
}
问题是,txt文件内容在运行时发生了变化,是否可以与这些变化同步?我的意思是,如果txt文件被更改,文本框的内容将被更改。如果可能,请给出一些代码示例Ic#或XAML
我现在的解决方案是,我制作了一个“刷新”按钮,再次读取txt文件的视图:
<TextBox Text="{Binding myText}"/>
将INotifyPropertyChanged实现到您的窗口
并更改属性
MyText
而不是MyTextBox
,您可以配置FileSystemWatcher
。我添加了FileWatcherConfigure
函数作为示例
每当文件更改时,将发布FileChanged
事件。您应该使用该事件触发refreshttextbox
方法
FileSystemWatcher fileWatcher = new FileSystemWatcher();
string filePath = @"./Log.txt";
public MainWindow()
{
InitializeComponent();
ReadFromTxt();
FileWatherConfigure();
}
public void FileWatherConfigure()
{
fileWatcher.Path = System.IO.Path.GetDirectoryName(filePath);
fileWatcher.Filter = System.IO.Path.GetFileName(filePath);
fileWatcher.Changed += FileWatcher_Changed;
fileWatcher.EnableRaisingEvents = true;
}
private void FileWatcher_Changed(object sender, FileSystemEventArgs e)
{
Thread.Sleep(TimeSpan.FromSeconds(1));
ReadFromTxt();
}
void ReadFromTxt()
{
string[] lines = System.IO.File.ReadAllLines(filePath);
MyTextBox.Dispatcher.Invoke(() => { this.MyTextBox.Text = string.Join(Environment.NewLine, lines); });
}
您需要一个FileSystemWatcher,它将触发一个事件,您可以使用该事件自动刷新文本框的内容 我在一个项目中使用以下内容来检测新的和更新的文件 我注意以下方面:
- LastAccess:在文件更改时获取事件
- LastWrite:在文件更改时获取事件
- FileName:在重命名文件时获取匹配的事件
只是为了澄清其他的答案,<代码>文件系统观察员> /代码>可以是一种选择,但是你应该明确地考虑轮询作为一种选择。可读性(基于观点)和可靠性(见此)。请注意,还有许多其他帖子强调了与使用
FileSystemWatcher
有关的问题
我所说的民意调查是指寻找特定周期的变化。一种选择是使用一种方法,寻找变化并相应地采取行动 您需要FileSystemWatcher。。。你可以看看这不是他问的。他要求能够检测文件中的更改,以自动用最新内容更新文本框。我很乐意帮助:)
FileSystemWatcher fileWatcher = new FileSystemWatcher();
string filePath = @"./Log.txt";
public MainWindow()
{
InitializeComponent();
ReadFromTxt();
FileWatherConfigure();
}
public void FileWatherConfigure()
{
fileWatcher.Path = System.IO.Path.GetDirectoryName(filePath);
fileWatcher.Filter = System.IO.Path.GetFileName(filePath);
fileWatcher.Changed += FileWatcher_Changed;
fileWatcher.EnableRaisingEvents = true;
}
private void FileWatcher_Changed(object sender, FileSystemEventArgs e)
{
Thread.Sleep(TimeSpan.FromSeconds(1));
ReadFromTxt();
}
void ReadFromTxt()
{
string[] lines = System.IO.File.ReadAllLines(filePath);
MyTextBox.Dispatcher.Invoke(() => { this.MyTextBox.Text = string.Join(Environment.NewLine, lines); });
}
public class MyWindow : Window
{
public MyWindow()
{
InitializeComponent();
FileSystemWatcher watcher = new FileSystemWatcher();
watcher.Path = @"D:\";
watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName;
watcher.Filter = "Log.txt";
// Add event handlers.
watcher.Changed += new FileSystemEventHandler(OnFileChanged);
watcher.Created += new FileSystemEventHandler(OnFileChanged);
watcher.Renamed += new RenamedEventHandler(OnFileRenamed);
// Begin watching.
watcher.EnableRaisingEvents = true;
ReadFromTxt();
}
private void OnFileChanged(object source, FileSystemEventArgs e)
{
ReadFromTxt();
}
private void OnFileRenamed(object source, RenamedEventArgs e)
{
ReadFromTxt();
}
private void ReadFromTxt()
{
// The easiest way is to just replace the whole text
MyTextBox.Text = "";
if (System.IO.File.Exists(@"D:\Log.txt") == false)
{
return;
}
string[] lines = System.IO.File.ReadAllLines(@"D:\Log.txt");
foreach (string line in lines)
{
MyTextBox.AppendText(line + Environment.NewLine);
}
}
}