2016-03-22 26 views
0

Şu anda bir sohbet istemcisi üzerinde çalışıyorum ve istemciyi Windows formlarından (formlar boktan gibi) WPF'ye değiştirdim. Bir sohbet kutusunu gerçekleştirmek için hangi kontrolün kullanılabileceğinden emin değilim. Bir TextBox alabilirdim ancak bu, dolu olduğunda tam içeriği göstermeyecek. Ayrıca bir ListBox kullanmayı denedim ama öğeler eklemeye çalıştığımda görüntülenmiyor. Ben ona içerik eklemek için bu kodu kullandı:WPF Sohbet kutusu kontrolü

internal void AddMessage(string message) 
{ 
    listBox_messages.Items.Add(message); 
    listBox_messages.Items.Refresh(); 
} 

hangi denetim bu amaç için iyi olurdu herkes bilir mu?

Yardımlarınız için teşekkürler!

Düzelt: Bunun için bir TextBox uygulayıp devre dışı bıraktım. Ancak bu yönteme eklediğim metin gösterilmiyor. Benim sınıfı:

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

dizeleri gösterilmektedir testi ama yöntem AddMessage tarafından eklenen metin değildir. Yöntemin çağrıldığını doğrulayabilirim, sadece bu yöntem içinde bir kesme noktasıyla kontrol ettim. Bunun nasıl olabileceğine dair bir ipucu var mı?

+0

Tercih edilen WPF yolu, doğrudan UI'yi işlemek yerine veri bağlama (MVVM) kullanmaktır. Mesajları görüntülemek için ControlTemplate ile ListBox'a sahip olabilirsiniz. Bu [örnek] (http://wblum.org/listbind/net3/index.html) yapmaya çalıştığınız şeye benzer. –

+0

Bu koddaki tüm bu şeyleri arkana koymamalısınız. Bunun yerine, görünüm modellerini kullanın ve bağlamaları ve komutları kullanarak görünümleri ve görünüm modellerini bağlayın. –

+0

Peki ben WPF için yeni ve bu tür modelleri ile biraz bunalmış değilim. Sadece WPF ile Formlar ile değil, aptal ve primit bir form istiyorum. – chris579

cevap

2

* Düzenlemenizle cevaben: Eğer gelen AddMessage() arıyorsun? Kodunuzu denedim ve sadece AddMessage ("foo") denir; Düğme tıklama olayından ve iyi çalıştı.

Sohbet kutusu için sohbet mesajlarını yazmak için bir TextBox kullanırdım ve kaydırma yapmak için ScrollViewer ile sardım. Mesaj yazmak için TextBox'taki AppendText() 'i kullandıktan sonra, TextBox'un altına gitmek için ScrollToEnd() öğesini çağırabilirsiniz.

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); 
     } 
    } 
+0

Neden değişkene alt çizgi ekliyorsunuz? Bunu zaten birkaç kez görmüştüm ama bu yapıldığında asla anlamadım. – chris579

+1

Alt çizgi ekleme, sınıf alanlarını yerel değişkenlerden ayırmaya yardımcı olan genel bir kuraldır. –

+0

Düzenlemenize yanıt verme: TcpConnection ve diğer şeyleri işleyen Statik sınıf Programındaki AddMessage yöntemini arıyorum. Bu metodu aynı sınıfta çağırırken hiçbir problemim yok ama dışarıdan çağrıldığında işe yaramıyor. – chris579

0

Bir TextBox'ı kullanabilir ve Xaml dosyanızda VerticalAlignment öğesini Stretch olarak ayarlayabilirsiniz.

< TextBox x: Adı = "metin" VerticalAlignment = "Stretch">

2

Güncelleme

Programı sınıfı başka bir iş parçacığı daha içinden AddMessage (dize) çağırırsa: ardındaki kodunda

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

: XAML içinde

UI iş parçacığı, UI'yi güncelleştirmek için bir Dispatcher kullanmanız gerekir.

MVVM

Application.Current.Dispatcher.BeginInvoke(new Action(() => 
{ 
    mainWindow.AddMessage(message); 
})); 

WPF kullanırken gitmek yoludur.

  1. (ChatViewModel.cs) sizin ViewModel sınıfında bir ObservableCollection mesajlarınızı ekleyin:
public class ChatViewModel 
{ 
    public ObservableCollection<string> Messages { get; } = new ObservableCollection<string>(); 

    internal void AddMessage(string message) 
    { 
     Messages.Add(message); 
    } 
} 
  1. ayarlayın View DataContext olarak bu ViewModel (ChatView.Eklemek
<ListBox ItemsSource="{Binding Messages}") /> 

: xaml)

public ChatView : UserControl 
{ 
    public ChatView() 
    { 
     InitializeComponent(); 
     DataContext = new ChatViewModel(); 
    } 
} 
    XAML-Code
  1. sizin ListBox ait ItemsSource özelliğine ObservableCollection bağlamak Mesajlar koleksiyonuna bir mesaj, ListBox içinde görünmelidir. Bu tam bir örnek değildir, ancak sizi doğru yöne doğru yönlendirmelidir.