wpf listbox scroll和textbox输入关键操作

时间:2018-05-15 12:19:08

标签: c# wpf

我正在为学校项目建立一个聊天室,我有两个问题。

  1. 我有一个列表框,其中包含并显示所有消息,但我无法自动向下滚动。(我可以使用xaml吗?)

    <ListBox ItemsSource="{Binding Messages, Mode=OneWay}"  HorizontalAlignment="Left" Height="494" Margin="255,126,0,0" 
     VerticalAlignment="Top" ScrollViewer.CanContentScroll="True"   Width="416"/>
    
  2. 我还有一个文本框来写一条消息,我想发送 按下输入时的消息,但消息始终为空。

     <TextBox Text="{Binding MsgToSend, Mode=TwoWay}" HorizontalAlignment="Left" 
      Height="65" Margin="60,625,0,0" TextWrapping="Wrap" 
      VerticalAlignment="Top" Width="520" FontSize="20" 
      TextChanged="TextBox_TextChanged" KeyDown="sendbyenter"/>
    
  3. 代码背后

        private void sendbyenter(object sender, KeyEventArgs e)
        {
            if (e.Key.Equals(Key.Enter))
    
               string message = Observable.MsgToSend;
            try
            {
                Observable.mychatroom.sendMessage(Observable.MsgToSend);
                Observable.Messages.Add(Observable.MsgToSend);
                Observable.MsgToSend = "";
    
            }
        }
    

1 个答案:

答案 0 :(得分:0)

如果没有看到更多代码,很难分辨,但我怀疑你的问题在于:

首先,您需要确定哪些事件会导致列表框滚动。确定这些事件后,请订阅这些事件并从后面的代码中调用ScrollIntoView中的ListBox事件。这可能只是在处理传入和传出消息的事件中完成。实施例。

myListBox.ScrollIntoView(Observable.Messages[Observable.Message.Last-1]);

我不知道您的Observable课程的结构如何,因此您可能需要调整ScrollIntoView事件中传递的内容。您的目标是传递添加到集合中的最新消息。此外,您需要为ListBox命名,以便从代码隐藏中访问它。

其次,您的消息始终为空,因为您的Observable类很可能是可变的。您将MsgToSend添加到集合中,然后将其值重置为空。重置该值时,您还要重置添加到集合中的值。通过message代替Observable.MsgToSend

private void sendbyenter(object sender, KeyEventArgs e)
{
    if (e.Key.Equals(Key.Enter))
       string message = Observable.MsgToSend;
    try
    {
        Observable.mychatroom.sendMessage(message);
        Observable.Messages.Add(message);
        Observable.MsgToSend = "";

    }
}