第一次在 XAML 开发,无法进行聊天
First time developing in XAML, cannot make my chat work
我第一次在 XAML 中编写应用程序,我从不同的来源学习并尝试制作一个应用程序。现在我正在努力制作一个好看的聊天,但是 运行 遇到一个我根本无法解决的错误。
主窗口中出现错误的部分:
<chat:ChatViewModel/>
这将调用创建聊天的用户控件 CharViewModel
。这是此用户控件的 XAML 部分:
<UserControl.Resources>
<DataTemplate DataType="{x:Type local:IncomingMessage}">
<Grid >
<Border Background="Orange" CornerRadius="15 15 0 15" Margin="10 12">
<TextBlock Margin="15" TextWrapping="Wrap" Foreground="CadetBlue" Text="{Binding MessageContent}"/>
</Border>
<TextBlock Text="Thu 5:45PM" HorizontalAlignment="Left" VerticalAlignment="Bottom" FontSize="10" Margin="10 0"/>
</Grid>
</DataTemplate>
<DataTemplate DataType="{x:Type local:OutgoingMessage}">
<Grid >
<Border Background="Gray" CornerRadius="15 15 0 15" Margin="10 12">
<TextBlock Margin="15" TextWrapping="Wrap" Foreground="CadetBlue" Text="{Binding MessageContent}"/>
</Border>
<TextBlock Text="Thu 5:45PM" HorizontalAlignment="Right" VerticalAlignment="Bottom" FontSize="10" Margin="10 0"/>
</Grid>
</DataTemplate>
</UserControl.Resources>
<UserControl.DataContext>
<local:MessageList/>
</UserControl.DataContext>
<Grid>
<ItemsControl ItemsSource="{Binding Messages}"/>
</Grid>
这是 C# 代码:
public partial class ChatViewModel : UserControl
{
public ChatViewModel()
{
InitializeComponent();
}
}
这是我的消息列表的样子:
class MessageList : ViewModelBase
{
public MessageList()
{
Messages = new ObservableCollection<Message>();
}
public ObservableCollection<Message> Messages { get; set; }
}
最后,这是 MainWindow.cs 中用于从文本文件创建消息列表的代码。每条消息的格式为“David/Hi 你好吗?”在文本文件中:
var ListMessage = new MessageList();
using (StreamReader file = new StreamReader("../Utilisateur/Chat.txt"))
{
string text;
while ((text = file.ReadLine()) != null)
{
string[] list = text.Split('/');
if (list[0] == "David")
{
ListMessage.Messages.Add(new OutgoingMessage { MessageContent = list[1] });
}
else
{
ListMessage.Messages.Add(new IncomingMessage { MessageContent = list[1] });
}
}
}
消息 class 如下所示:
public class Message : ViewModelBase
{
///Sender Name
public string SenderName { get; set; }
///Text of the message
private string _messageContent;
public string MessageContent
{
get
{
return _messageContent;
}
set
{
_messageContent = value;
OnPropertyChanged("MessageContent");
}
}
///True if message has been read
public bool MessageRead;
///Time the message was sent
public DateTimeOffset MessageSentTime { get; set; }
}
还有我从网上复制的ViewModelBase,因为我不完全明白它是如何工作的
public class ViewModelBase : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged([CallerMemberName] string propName = null)
{
var handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propName));
}
}
}
这里我有一个文本文件,每一行代表一条消息,格式为“NameOfTheTender/Message”。
然后我想将消息显示为小气泡,o运行ge 和 window 的左侧,如果我收到消息,灰色和右侧,如果我发送它。目前 window 上没有显示任何内容。
How the window looks like right now
UserControl 的 DataContext 中的 <local:MessageList/>
和 Window 后面的代码中的 new MessageList()
创建了两个不同的 MessageList 实例。向其中一个添加项目对另一个没有影响。
您的 UserControl 不应设置自己的 DataContext。从 UserControl 的 XAML:
中删除此 DataContent 分配
<UserControl.DataContext>
<local:MessageList/>
</UserControl.DataContext>
为了使 UserControl 绑定到在 MainWindow 中创建的 MessageList 实例,只需将其分配给 Window 的 DataContext:
var ListMessage = new MessageList();
DataContext = ListMessages;
DataContext 属性 的值现在将由 UserControl 继承。
我第一次在 XAML 中编写应用程序,我从不同的来源学习并尝试制作一个应用程序。现在我正在努力制作一个好看的聊天,但是 运行 遇到一个我根本无法解决的错误。
主窗口中出现错误的部分:
<chat:ChatViewModel/>
这将调用创建聊天的用户控件 CharViewModel
。这是此用户控件的 XAML 部分:
<UserControl.Resources>
<DataTemplate DataType="{x:Type local:IncomingMessage}">
<Grid >
<Border Background="Orange" CornerRadius="15 15 0 15" Margin="10 12">
<TextBlock Margin="15" TextWrapping="Wrap" Foreground="CadetBlue" Text="{Binding MessageContent}"/>
</Border>
<TextBlock Text="Thu 5:45PM" HorizontalAlignment="Left" VerticalAlignment="Bottom" FontSize="10" Margin="10 0"/>
</Grid>
</DataTemplate>
<DataTemplate DataType="{x:Type local:OutgoingMessage}">
<Grid >
<Border Background="Gray" CornerRadius="15 15 0 15" Margin="10 12">
<TextBlock Margin="15" TextWrapping="Wrap" Foreground="CadetBlue" Text="{Binding MessageContent}"/>
</Border>
<TextBlock Text="Thu 5:45PM" HorizontalAlignment="Right" VerticalAlignment="Bottom" FontSize="10" Margin="10 0"/>
</Grid>
</DataTemplate>
</UserControl.Resources>
<UserControl.DataContext>
<local:MessageList/>
</UserControl.DataContext>
<Grid>
<ItemsControl ItemsSource="{Binding Messages}"/>
</Grid>
这是 C# 代码:
public partial class ChatViewModel : UserControl
{
public ChatViewModel()
{
InitializeComponent();
}
}
这是我的消息列表的样子:
class MessageList : ViewModelBase
{
public MessageList()
{
Messages = new ObservableCollection<Message>();
}
public ObservableCollection<Message> Messages { get; set; }
}
最后,这是 MainWindow.cs 中用于从文本文件创建消息列表的代码。每条消息的格式为“David/Hi 你好吗?”在文本文件中:
var ListMessage = new MessageList();
using (StreamReader file = new StreamReader("../Utilisateur/Chat.txt"))
{
string text;
while ((text = file.ReadLine()) != null)
{
string[] list = text.Split('/');
if (list[0] == "David")
{
ListMessage.Messages.Add(new OutgoingMessage { MessageContent = list[1] });
}
else
{
ListMessage.Messages.Add(new IncomingMessage { MessageContent = list[1] });
}
}
}
消息 class 如下所示:
public class Message : ViewModelBase
{
///Sender Name
public string SenderName { get; set; }
///Text of the message
private string _messageContent;
public string MessageContent
{
get
{
return _messageContent;
}
set
{
_messageContent = value;
OnPropertyChanged("MessageContent");
}
}
///True if message has been read
public bool MessageRead;
///Time the message was sent
public DateTimeOffset MessageSentTime { get; set; }
}
还有我从网上复制的ViewModelBase,因为我不完全明白它是如何工作的
public class ViewModelBase : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged([CallerMemberName] string propName = null)
{
var handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propName));
}
}
}
这里我有一个文本文件,每一行代表一条消息,格式为“NameOfTheTender/Message”。
然后我想将消息显示为小气泡,o运行ge 和 window 的左侧,如果我收到消息,灰色和右侧,如果我发送它。目前 window 上没有显示任何内容。 How the window looks like right now
<local:MessageList/>
和 Window 后面的代码中的 new MessageList()
创建了两个不同的 MessageList 实例。向其中一个添加项目对另一个没有影响。
您的 UserControl 不应设置自己的 DataContext。从 UserControl 的 XAML:
中删除此 DataContent 分配<UserControl.DataContext>
<local:MessageList/>
</UserControl.DataContext>
为了使 UserControl 绑定到在 MainWindow 中创建的 MessageList 实例,只需将其分配给 Window 的 DataContext:
var ListMessage = new MessageList();
DataContext = ListMessages;
DataContext 属性 的值现在将由 UserControl 继承。