إظهار جسم البريد الإلكتروني في TextBox من Listbox IMAP/pop3

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

سؤال

لذلك لديّ مربع قائمة يعرض موضوع بريد إلكتروني (أستخدم عميل 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 ، قم بإعداد قائمات Listboxes لربط الخصائص التي تريدها ، وقم بإعداد معالجات الأحداث عندما يتغير التحديد.

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

ثم في الكود الخاص بك وراء. قم بربط boxes بقائمة كائنات البريد الإلكتروني.

        listbox1.ItemsSource = emails;
        listbox2.ItemsSource = emails;

أخيرًا ، تحتاج إلى التعامل مع الحدث من Bistboxes.

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

لقد أضفت ObservableCollection من النوع المزيف إلى النافذة. تعمل 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>

بعض الملاحظات الدقيقة: قائمة القائمة Selecsource يرتبط بـ ObservableCollection التي حددتها على النافذة. سوف يستمع ListBox للعناصر القادمة والذهاب في هذه المجموعة ، واستخدام datatemplate لعرض واجهة المستخدم لكل عنصر في Colleciton.

لكل FakeMail الذي يكتشفه itemTemplate ، فإنه ينشئ مثيلًا جديدًا من datatemplate والمحتويات ، وتعيين datacontext من القالب إلى مثيل المزيف. هذا يعني أنه في Datatemplate ، يمكنني ببساطة الربط مع خصائص مثيل FakeMail وكل شيء يتم توصيله في وقت التشغيل.

يحتوي القائمة على خاصية تسمى SelectionValue, ، والتي يمكنني استخدامها لإظهار رسالة البريد الإلكتروني. عند تحديد عنصر في قائمة القائمة ، SelectionValue هو المثيل من العناصر التي هي datacontext من datatemplate ؛ ما يتم عرضه حاليًا في هذا العنصر في واجهة المستخدم. لذلك ، من أجل إظهار رسالة البريد الإلكتروني المحددة حاليًا ، أحتاج فقط إلى الربط بين العناصر المختارة رسالة الخاصية ، منذ SelectValue سيكون البريد الإلكتروني المحدد حاليًا.

وهذا كل شيء. لا الاستماع ، لا " r n" bs. يربط زوجان ومجموعة يمكن ملاحظتها.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top