Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在运行期间从txt文件更新文本框,无需单击;刷新“;_C#_Wpf_Xaml - Fatal编程技术网

C# 在运行期间从txt文件更新文本框,无需单击;刷新“;

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

在wpf中,我有一个文本框,它的内容来自一个txt文件

在代码behine中,它看起来像:

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);
    }
  }
}