代码之家  ›  专栏  ›  技术社区  ›  Giovanni Le Grand

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

  •  -2
  • Giovanni Le Grand  · 技术社区  · 9 年前

    我正在构建一个WPF应用程序,其中我有一个文本框,但问题是这个文本框需要以文本形式获取文件的内容,只有txt文件也会被写入。

    我制作了一个类来处理这个问题:

    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>
    

    有人能帮我解决这个问题吗?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Giovanni Le Grand    9 年前

    我无法再现您的确切问题,我得到的问题是文本文件中只有新文本出现。这是因为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);
        }
    }
    

    聊天处理程序

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