0

Есть функция которая выводит все сообщения из INBOX в listbox(lbPreview)
lbPreview у меня только для вывода превью сообщения

        private Task LoadFull()
    {
        return Task.Run(() =>
        {
            try
            {
                using (var client = new ImapClient())
                {
                    using (var cancel = new CancellationTokenSource())
                    {
                        client.Connect("imap.gmail.com", 993, true, cancel.Token);
                        client.Authenticate("mymail@gmail.com", "mypassword", cancel.Token);
                        // get message from INBOX
                        var inbox = client.Inbox;
                        inbox.Open(FolderAccess.ReadOnly, cancel.Token);
                    // show in toolbox
                    Application.Current.Dispatcher.Invoke(new Action(() =>
                    {
                        txtCountMessage.Text = inbox.Count.ToString();
                    }));

                    // for all message
                    Application.Current.Dispatcher.Invoke(new Action(() =>
                    {
                        for (int i = 0; i < inbox.Count; i++)
                        {
                            var message = inbox.GetMessage(i, cancel.Token);
                            lbPreviewMail.Items.Add(message.Subject);
                        }
                    }));
                }
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }
    });
}

Так же у меня есть ещё один listbox
Как это все выглядит


Как сделать чтобы при нажатии на lbPreview в lbAllMessage вывести всё сообщение?!
  • https://ru.stackoverflow.com/a/816149/220553 – EvgeniyZ Sep 26 '21 at 09:36
  • не коректно к моему вопросу( – Purple Pig Sep 26 '21 at 10:59
  • 1
    Из-за того, что вы пренебрегли всеми современными технологиями и правилами проектирования, по типу хотя бы базовых привязок? Ну, может быть. Делайте тогда дальше костыли в виде события выбора, по которому будет загружена информация куда вам надо. Сейчас, источником ваших данных являются контролы (ListBox и др.), что очень плохо, ибо так вы сами себя связываете, оставляя минимальное место для дальнейших маневров. По-хорошему, все сообщения, должны быть в виде отдельных классов, а еще лучше, должны быть привязаны к UI, а не заданы напрямую. И да, не забывайте ставить все метки вопросу (c#)! – EvgeniyZ Sep 26 '21 at 11:09
  • Так ведь нету разницы! У меня вопрос был таков: как показать выбраное сообщение – Purple Pig Sep 27 '21 at 04:41
  • Как это нет разницы? Она огромная, начиная банальным уменьшением кода (ведь если вы привязываете, то многое за вас делает сам WPF), и заканчивая той же производительностью (ведь если у вас грамотно спроектирован проект, то вы и ресурсов потребляете меньше, к примеру сейчас вы постоянно дергаете UI, ибо все данные в нем, а должны быть в простом классе). Это я еще не говорю про удобность, ведь если в вашем коде надо будет что-то изменить/добавить, то это означает переписывание всего кода. На ваш вопрос я уже сказал, что делать Делайте тогда дальше костыли в виде события выбора. – EvgeniyZ Sep 27 '21 at 11:37

1 Answers1

0

Решил свою проблему с помощью linq

            using (var client = new ImapClient())
        {
            using (var cancel = new CancellationTokenSource())
            {
            client.Connect("imap.gmail.com", 993, true, cancel.Token);

            // If you want to disable an authentication mechanism,
            // you can do so by removing the mechanism like this:
            client.AuthenticationMechanisms.Remove("XOAUTH");

            client.Authenticate("chorrnyinc@gmail.com", "epvytbgottgvwexh", cancel.Token);

            // The Inbox folder is always available...
            var inbox = client.Inbox;
            inbox.Open(FolderAccess.ReadOnly, cancel.Token);
            // let's try searching for some messages...
            Application.Current.Dispatcher.Invoke(new Action(() =>
            {
                var query = SearchQuery.DeliveredAfter(DateTime.Parse("2021-01-01"))
                .And(SearchQuery.SubjectContains(tbSearching.Text)
                .And(SearchQuery.Seen));

                foreach (var uid in inbox.Search(query, cancel.Token))
                {
                    var message = inbox.GetMessage(uid, cancel.Token);
                    lbPreviewMail.Items.Add(message.Subject);
                }
            }));
        }
    }