因此,我有一个列表框,显示电子邮件的主题(我使用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。几个绑定和可观察的收藏。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top