在文本框[WPF]中动态显示文件内容

本文关键字:动态 显示文件 文本 WPF | 更新日期: 2023-09-27 18:08:17

我正在构建一个WPF应用程序,其中我有一个文本框,但问题是,这个文本框需要得到一个文件的内容作为文本,只有文本文件不断写入太。

我已经做了一个类来处理这个:

public class ChatHandler
{
    public FileStream stream;
    StreamWriter writer;
    StreamReader reader;
    public ChatHandler()
    {
        stream = new FileStream(@"chat/" + DateTime.Today.ToString("d") + ".txt", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);
        writer = new StreamWriter(stream);
        reader = new StreamReader(stream);
    }
    public void Write(string line)
    {
        writer.WriteLineAsync(line);
        writer.Flush();
    }
    public string Read()
    {
        string tmp = "";
        string line;
        while((line = reader.ReadLine()) != null){
            tmp += line + ''n';
        }
        return tmp;
    }
}

,我有一个用户控件,它有文本框:

public partial class ChatScreen : UserControl
{
    MainWindow parent;
    ChatHandler chatHandler;
    BackgroundWorker worker;
    public ChatScreen()
    {
        InitializeComponent();
        chatHandler = new ChatHandler();
        worker = new BackgroundWorker();
        worker.WorkerSupportsCancellation = true;
        worker.DoWork += new DoWorkEventHandler(run);
    }
    private void load()
    {
    }
    private void write(string text)
    {
        if (chat.Text != text && text != "")
        {
            chat.Text = text;
        }
    }
    private void run(object sender, DoWorkEventArgs e)
    {
        BackgroundWorker bg = sender as BackgroundWorker;
        while (!bg.CancellationPending)
        {
            chat.Dispatcher.BeginInvoke((Action)(()=>{
                write(parent.Handler.Read());                    
            }));
            Thread.Sleep(100);
        }
    }
    private void chat_Loaded(object sender, RoutedEventArgs e)
    {
        parent = (MainWindow)Window.GetWindow(this);
        if (!worker.CancellationPending)
        {
            worker.RunWorkerAsync();
        }
    }
    private void chat_Unloaded(object sender, RoutedEventArgs e)
    {
        worker.CancelAsync();
    }
}

但是现在问题出现了:文本永远不会改变,它被设置一次,再也不会改变了:(即使在文本文件中添加了行。

xaml文件的内容如下:

<UserControl x:Class="tantiBotv2.ChatScreen"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         d:DesignHeight="381" d:DesignWidth="641" Loaded="chat_Loaded" Unloaded="chat_Unloaded">
    <Grid Style="{StaticResource ContentRoot}">
        <ScrollViewer HorizontalScrollBarVisibility="Disabled" VerticalScrollBarVisibility="Visible">
            <TextBox IsReadOnly="true" Margin="0,0,0,0" TextWrapping="Wrap" Name="chat" IsReadOnlyCaretVisible="false"/>
        </ScrollViewer>
    </Grid>
</UserControl>
有谁能帮我解决这个问题吗?

在文本框[WPF]中动态显示文件内容

我无法重现您的确切问题,我得到的问题是只有文本文件中的新文本出现。这是因为StreamReader是一个成员变量,它是一个仅转发的读取器。你可以这样做:

public string Read()
{
    using (var stream = new FileStream(@"chat.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite))
    {
        using (var reader = new StreamReader(stream))
        {
            string tmp = "";
            string line;
            while ((line = reader.ReadLine()) != null)
            {
                tmp += line + ''n';
            }
            return tmp;
        }
    }
}

编辑:在问题被澄清了一点之后:

XAML:

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition></ColumnDefinition>
        <ColumnDefinition></ColumnDefinition>
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="*"></RowDefinition>
    </Grid.RowDefinitions>
    <DockPanel Grid.Column="0" LastChildFill="True">
        <Label DockPanel.Dock="Top">IRC channel simulator</Label>
        <Button DockPanel.Dock="Top" Click="Button_Click">Send Chat</Button>
        <ScrollViewer HorizontalScrollBarVisibility="Disabled" VerticalScrollBarVisibility="Visible">
            <TextBox Background="AliceBlue" AcceptsReturn="True" Margin="0,0,0,0" TextWrapping="Wrap" Name="chatWriter" IsReadOnlyCaretVisible="false" />
        </ScrollViewer>
    </DockPanel>
    <ScrollViewer Grid.Column="1" HorizontalScrollBarVisibility="Disabled" VerticalScrollBarVisibility="Visible">
        <TextBox IsReadOnly="true" Margin="0,0,0,0" TextWrapping="Wrap" Name="chat" IsReadOnlyCaretVisible="false"/>
    </ScrollViewer>
</Grid>

Xaml:

public partial class MainWindow : Window
{
    ChatHandler chatHandler;
    BackgroundWorker worker;
    public MainWindow()
    {
        InitializeComponent();
        chatHandler = new ChatHandler();
        worker = new BackgroundWorker();
        worker.WorkerSupportsCancellation = true;
        worker.DoWork += new DoWorkEventHandler(run);
    }
    private void write(string text)
    {
        if (chat.Text != text && text != "")
        {
            chat.Text = text;
        }
    }
    private void run(object sender, DoWorkEventArgs e)
    {
        BackgroundWorker bg = sender as BackgroundWorker;
        while (!bg.CancellationPending)
        {
            chat.Dispatcher.BeginInvoke((Action)(() => {
                write(chatHandler.Read());
            }));
            Thread.Sleep(100);
        }
    }
    private void chat_Loaded(object sender, RoutedEventArgs e)
    {
        if (!worker.CancellationPending)
        {
            worker.RunWorkerAsync();
        }
    }
    private void chat_Unloaded(object sender, RoutedEventArgs e)
    {
        worker.CancelAsync();
    }
    private void Button_Click(object sender, RoutedEventArgs e)
    {
        chatHandler.Write(chatWriter.Text);
    }
}

ChatHandler.cs

public class ChatHandler
{
    public FileStream stream;
    //StreamWriter writer;
    //StreamReader reader;
    public ChatHandler()
    {
        stream = new FileStream(@"chat.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);
        //writer = new StreamWriter(stream);
        //reader = new StreamReader(stream);
    }
    public void Write(string line)
    {
        using (var fileStream = new FileStream(@"chat.txt", FileMode.Append, FileAccess.Write, FileShare.ReadWrite))
        {
            using (var writer = new StreamWriter(fileStream))
            {
                writer.WriteLineAsync(line);
                writer.Flush();
            }
        }
    }
    public string Read()
    {
        using (var fileStream = new FileStream(@"chat/" + DateTime.Today.ToString("d") + ".txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
        {
            using (var reader = new StreamReader(fileStream))
            {
                string tmp = "";
                string line;
                while ((line = reader.ReadLine()) != null)
                {
                    tmp += line + ''n';
                }
                return tmp;
            }
        }
    }
}