Показать кузов электронной почты в текстовом поле из Listbox IMAP / POP3

StackOverflow https://stackoverflow.com/questions/3688573

Вопрос

Таким образом, у меня есть список списков, который показывает тему электронного письма (я использую клиент Chilkat IMAP), когда я выбираю тему электронной почты, я хочу показать тело сообщения в текстовом поле, но я не могу выяснить, как это сделать, Овысив Используйте событие Listbox Selectindexchaned, но как бы я пошел об этом

Код до сих пор

// 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 и Copypaste в несколько строк (измените мое пространство имен имен и классов, чтобы соответствовать приложению, которое вы создаете!) И увидите его в действии.

Есть одно окно. Я моделирую электронные письма здесь; Вы получите ваши электронные письма и сбросьте их в коллекции:

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

Я добавил наблюдательный элемент Type Fakeemail к окну. 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.

Для каждого FakeMail ItemTemplate находит, он создает новый экземпляр DataTemplate и содержимое и устанавливает DataContext. шаблона к экземпляру FakeMail. Это означает, что в рамках DataTemplate я могу просто привязать к свойствам экземпляра FakeMail, и все проводятся во время выполнения.

ListBox имеет свойство под названием Allownevalue., который я могу использовать, чтобы показать сообщение электронной почты. Когда вы выбираете элемент в списке, Allownevalue. является экземпляром из элементов элементами материала, который является DataContext The DataTemplate; То, что в данный момент отображается в этом элементе в интерфейсе UI. Итак, для того, чтобы показать сообщение о том, чтобы выбрать сообщение электронной почты, мне просто нужно привязать к выбранному значению предметов. Сообщение Свойство, поскольку allentValue будет выбран в данный момент электронную почту.

Вот и все. Нет слушания, нет " r n" bs. Пара связывается и наблюдаемая коллекция.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top