首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPF Chatbox控件

WPF Chatbox控件
EN

Stack Overflow用户
提问于 2016-03-22 21:38:51
回答 3查看 3.3K关注 0票数 0

目前,我正在开发一个聊天客户端,并将我的客户端从windows窗体(因为表单很糟糕)更改为WPF。我不太确定哪个控件可以用来实现一个chatbox。我可以使用一个TextBox,但这将不会显示完整的内容时,它已满。我也尝试使用ListBox,但当我尝试添加项目时,它们将不会显示。我使用此代码向其添加内容:

代码语言:javascript
复制
internal void AddMessage(string message)
{
    listBox_messages.Items.Add(message);
    listBox_messages.Items.Refresh();
}

有谁知道哪个控制最适合这个目的?

谢谢你的帮忙!

编辑:我为此实现了一个TextBox,并禁用了它。但是我用这个方法附加的文本没有显示出来。我的班级:

代码语言:javascript
复制
using System.ComponentModel;
using System.Windows;

namespace Chat_Client
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        /// <summary>
        /// MainWindow constructor
        /// </summary>
        public MainWindow()
        {
            InitializeComponent();

            textBox_messages.AppendText("Test" + "\n");
            textBox_messages.AppendText("Test" + "\n");
            textBox_messages.AppendText("Test" + "\n");

            Closing += OnWindowClosing;
        }

        private void OnWindowClosing(object sender, CancelEventArgs e)
        {
            Program.Shutdown();
        }

        private void button_connect_Click(object sender, RoutedEventArgs e)
        {
            if(Program.Connected)
            {
                Program.Disconnect();
            }
            else
            {
                Program.Connect();
            }            
        }

        private void button_sendMessage_Click(object sender, RoutedEventArgs e)
        {

        }

        internal void AddMessage(string message)
        {
            textBox_messages.AppendText(message + "\n");
        }
    }
}

将显示测试字符串,但AddMessage方法添加的文本不显示。我可以验证方法是否被调用,我只是在这个方法中用一个断点检查它。有人知道怎么会发生这种事吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-03-22 22:58:00

*响应您的编辑:您从哪里调用AddMessage()?我尝试了您的代码,只调用了AddMessage("foo");从按钮单击事件,运行良好。

对于一个聊天框,我会使用一个TextBox来编写聊天消息,然后用一个ScrollViewer包起来进行滚动。在使用AppendText()在TextBox上写入消息之后,您可以调用ScrollToEnd()来滚动到TextBox的底部。

在XAML中:

<ScrollViewer x:Name="ScrollViewer" ScrollChanged="ScrollViewer_OnScrollChanged"> <TextBox x:Name="ChatBox"/> </ScrollViewer>

在后面的代码中:

代码语言:javascript
复制
    private void WriteToChat(string message)
    {
        ChatBox.AppendText(message);
        ChatBox.ScrollToEnd();
    }

    private bool _autoScroll = true;
    private void ScrollViewer_OnScrollChanged(object sender, ScrollChangedEventArgs e)
    {
        if (e.ExtentHeightChange == 0)
        {
            _autoScroll = ScrollViewer.VerticalOffset == ScrollViewer.ScrollableHeight;
        }

        if (_autoScroll && e.ExtentHeightChange != 0)
        {
            ScrollViewer.ScrollToVerticalOffset(ScrollViewer.ExtentHeight);
        }
    }
票数 2
EN

Stack Overflow用户

发布于 2016-03-22 23:06:33

更新

如果Program从另一个线程中调用AddMessage(string),而不是UI线程,则必须使用Dispatcher来更新UI。

代码语言:javascript
复制
Application.Current.Dispatcher.BeginInvoke(new Action(() =>
{
    mainWindow.AddMessage(message);
}));

在使用WPF时,MVVM是最好的选择。

  1. 将您的消息添加到ObservableCollection中的ViewModel类(ChatViewModel.cs)中:
代码语言:javascript
复制
public class ChatViewModel
{
    public ObservableCollection<string> Messages { get; } = new ObservableCollection<string>();

    internal void AddMessage(string message)
    {
        Messages.Add(message);
    }
}
  1. 将此ViewModel设置为视图的DataContext (ChatView.xaml)
代码语言:javascript
复制
public ChatView : UserControl
{
    public ChatView()
    {
        InitializeComponent();
        DataContext = new ChatViewModel();
    }
}
  1. 在XAML代码中,将ObservableCollection绑定到ListBoxItemsSource属性。
代码语言:javascript
复制
<ListBox ItemsSource="{Binding Messages}") />

当您向邮件集合添加消息时,它应该出现在ListBox中。这不是一个完整的例子,但它应该引导你走向正确的方向。

票数 3
EN

Stack Overflow用户

发布于 2016-03-22 22:01:21

您可以使用TextBox并将VerticalAlignment设置为在Xaml文件中扩展。

< TextBox x:Name=“文本框”“VerticalAlignment=”拉伸“>

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36165741

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档