В wpf у меня есть текстовое поле, содержимое которого поступает из текстового файла.
в коде это выглядит так:
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 файла меняется во время выполнения, можно ли синхронизироваться с этими изменениями? Я имею в виду, что содержимое текстового поля изменится, если будет изменен текстовый файл. если возможно, дайте пример кода я C# или XAML.
Мое решение на данный момент состоит в том, что я сделал кнопку «Обновить», которая снова читает из текстового файла.





Вид :
<TextBox Text = "{Binding myText}"/>
Модель:
private string _myText;
public string MyText{
get { return _myText; }
set { _myText = value;
NotifyPropertyChanged();
}
Внедрите INotifyPropertyChanged в свое окно
И измените свойство MyText, а не MyTextBox
Он спросил не об этом. Он попросил иметь возможность обнаруживать изменения в файле, чтобы автоматически обновлять текстовое поле самым последним содержимым.
Вы можете настроить FileSystemWatcher. В качестве примера я добавил функцию FileWatcherConfigure.
При каждом изменении файла будет опубликовано событие FileChanged. Вы должны запустить метод RefreshTextbox с этим событием.
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); });
}
Рад помочь :)
Вам нужен FileSytemWatcher, который будет запускать событие, которое вы можете использовать для автоматического обновления содержимого текстового поля.
Я использую следующее в проекте, над которым я работаю, для обнаружения нового и обновленного файла.
Я слежу за:
Обратите внимание, что я очищаю текстовое поле каждый раз, чтобы избежать дублирования строк (ваш код добавит весь файл к существующему содержимому)
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);
}
}
}
Чтобы прояснить другие ответы, FileSystemWatcher может быть вариантом, но вам определенно следует рассмотреть возможность опроса в качестве альтернативы. Для удобочитаемости (на основе мнения) и надежности (см. Этот нить). Обратите внимание, что есть много других сообщений, в которых подчеркиваются проблемы, связанные с использованием FileSystemWatcher.
Под опросом я подразумеваю поиск изменений в определенные периоды. Можно было бы использовать Таймер и искать изменения и действовать соответственно.
Вам нужен FileSystemWatcher ... Можете посмотреть msdn.microsoft.com/en-us/library/…