从ListBox IMAP/POP3中显示电子邮件主体3
题
因此,我有一个列表框,显示电子邮件的主题(我使用chilkat imap客户端)当我选择电子邮件的主题时,我想在文本框中显示消息主体,但我无法弄清楚如何做到这一点使用ListBox SelectIndexchanaged事件,但是我该如何处理
到目前为止的代码
// Create an object, connect to the IMAP server, login,
// and select a mailbox.
Chilkat.Imap imap = new Chilkat.Imap();
imap.UnlockComponent("UnlockCode");
imap.Connect("Imap URL");
imap.Login("email address", "password");
imap.SelectMailbox("Inbox");
// Get a message set containing all the message IDs
// in the selected mailbox.
Chilkat.MessageSet msgSet;
msgSet = imap.Search("ALL", true);
// Fetch all the mail into a bundle object.
Chilkat.EmailBundle bundle = new Chilkat.EmailBundle();
bundle = imap.FetchBundle(msgSet);
// Loop over the bundle and display the From and Subject.
Chilkat.Email email;
int i;
for (i = 0; i < bundle.MessageCount - 1; i++)
{
email = bundle.GetEmail(i);
listBox1.Items.Add(email.From + ": " + email.Subject);
textBox1.Text = email.Body ;
}
// Save the email to an XML file
bundle.SaveXml("bundle.xml");
// Disconnect from the IMAP server.
// This example leaves the email on the IMAP server.
imap.Disconnect();
}
}
提前致谢
解决方案
假设电子邮件索引保持不变(我认为确保最安全的方法是缓存表单中的捆绑包),我将更改为使用 ListView
而不是 ListBox
然后我将索引添加到列表中,无论是单独的列还是在 Tag
项目。
设置后 ListView
看起来您需要看起来(ListView.View = View.Details;
和 ListView.MultiSelect = false;
可能是主要的),而不是:
listBox1.Items.Add(email.From + ": " + email.Subject);
您可以做类似的事情(如果您这样做 Tag
方式,这有点容易,但有些人认为不好):
listView1.Items.Add(email.From + ": " + email.Subject).Tag = i;
然后,当用户选择列表中的主题时,您会处理 ListView.SelectedIndexChanged
事件,然后做类似的事情:
if(ListView.SelectedItems.Count > 0)
{
textBox1.Text = bundle.GetEmail((int)ListView.SelectedItems[0].Tag).Body;
}
或者,如果您确定只想从电子邮件中获取文本,则可以将文本插入标签而不是索引中。
其他提示
在您的XAML中,设置了列表框以绑定到您想要的属性,并为选择更改时设置事件处理程序。
<StackPanel>
<ListBox Name="listbox1" SelectionChanged="listbox_SelectionChanged">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=From}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<ListBox Name="listbox2" SelectionChanged="listbox_SelectionChanged">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=Subject}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<TextBox Name="textbox1"></TextBox>
</StackPanel>
然后在您的代码后面。将列表框绑定到电子邮件对象的列表。
listbox1.ItemsSource = emails;
listbox2.ItemsSource = emails;
最后,您需要从列表框中处理事件。
private void listbox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
ListBox listbox = (ListBox)sender;
foreach (Email email in listbox.SelectedItems)
{
textbox1.Text = email.Body;
}
}
请注意,该代码未测试。
您的问题不是通过电子邮件,而是您如何以表格显示项目。您正在尝试以winforms的方式做事,这对Winforms来说是可以的,但实际上是毫无意义的,在WPF中是毫无意义的。您应该阅读有关MVVM的一些阅读(有关该主题的很多问题)。
这是一个演示,显示了您只使用几行代码来完成的操作,这些代码利用了WPF的绑定基础结构。您可以创建一个新的WPF应用程序,并复制几行(更改我的名称空间和类名称以匹配您创建的应用程序!)并在操作中看到它。
有一个窗口。我在这里模拟电子邮件;您会收到电子邮件并将其转储到集合中:
public partial class MainWindow : Window
{
public ObservableCollection<FakeEmail> Emails { get; private set; }
public MainWindow()
{
Emails = new ObservableCollection<FakeEmail>();
// simulates emails being received; you would popoulate with valid emails IRL
Emails.Add(new FakeEmail
{ From = "herp", Subject = "derp", Message = "herp derp" });
Emails.Add(new FakeEmail
{ From = "foo", Subject = "bar", Message = "foo bar" });
Emails.Add(new FakeEmail
{ From = "Binding", Subject = "Rocks", Message = "Binding rocks" });
InitializeComponent();
}
}
/// <summary>
/// I don't have your libraries
/// </summary>
public sealed class FakeEmail
{
public string From { get; set; }
public string Subject { get; set; }
public string Message { get; set; }
}
我在窗口中添加了一个类型的假邮件的观察力。当添加或去除元素时,OCS与绑定良好,因为该集合会通知绑定。
接下来,窗口。请注意,我没有显示 <Window
在这里定义,但我命名了窗口 emailClient
!
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<ListBox
x:Name="emailList"
ItemsSource="{Binding Emails, ElementName=emailClient}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock
Text="{Binding From}" />
<TextBlock
Text="{Binding Subject}"
TextWrapping="NoWrap"
TextTrimming="CharacterEllipsis" />
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<TextBlock
Grid.Column="1"
Text="{Binding SelectedValue.Message, ElementName=emailList, FallbackValue='Select an email pls'}" />
</Grid>
一些更好的注释:listbox的 物品库 绑定到我在窗口上定义的观察力集成。 ListBox将收听该集合中的项目,并使用DataTemplate在Colleciton中的每个项目显示UI。
对于每个伪造的eTheTemplate都可以找到的,它创建了一个新实例 DatateMplate 和内容,并设置 DataContext 伪造邮件实例的模板。这意味着,在DataTemplate中,我可以简单地绑定到假邮件实例的属性,并且在运行时一切都会连接起来。
ListBox具有一个名为的属性 选择值, ,我可以用来显示电子邮件。当您在列表框中选择一个项目时, 选择值 是来自itemssource的实例,它是DataTemplate的数据台面;当前在UI中该项目中显示的内容。因此,为了显示当前选定的电子邮件的消息,我只需要绑定到项目库的Selected Value的邮件 信息 属性,因为SelectedValue将是当前选择的电子邮件。
就是这样。不听,没有“ r n” bs。几个绑定和可观察的收藏。