Frage

Also ich habe ein Listenfeld, das zeigt das Thema einer E-Mail (Ich verwende den chilkat imap-Client), wenn ich das Thema einer E-Mail wähle ich den Nachrichtentext in einer Textbox zeigen will, aber ich kann nicht herausfinden, wie es zu tun , obviusly verwende ich das selectindexchanaged Ereignis listbox aber wie würde ich mich über sie

Code-So Far

// 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();
    }
}

Vielen Dank im Voraus

War es hilfreich?

Lösung

Unter der Annahme, dass die E-Mail-Indizes gleich bleiben (ich glaube, die sicherste Weg, um sicherzustellen, dass von den abgerufenen Bündel in Form zu zwischenzuspeichern wäre), habe ich auf die Verwendung eines ListView anstelle des ListBox ändern würde und dann habe ich‘ addiert d die Indizes in die Liste, entweder als separate Spalte oder in der Tag der Elemente.

Nachdem Sie den ListView zu sehen einrichten würde, wie Sie es brauchen, zu suchen (ListView.View = View.Details; und ListView.MultiSelect = false; sind wahrscheinlich die wichtigsten sind) statt:

listBox1.Items.Add(email.From + ": " + email.Subject);

Sie könnte so etwas wie (wenn Sie es Tag Weise tun, die etwas einfacher ist, aber einige Leute denken, ist schlecht):

listView1.Items.Add(email.From + ": " + email.Subject).Tag = i;

Und dann, wenn der Benutzer wählt ein Thema in der Liste, wie Sie sagen, behandeln Sie das ListView.SelectedIndexChanged Ereignis und dann tun nur so etwas wie:

if(ListView.SelectedItems.Count > 0)
{
    textBox1.Text = bundle.GetEmail((int)ListView.SelectedItems[0].Tag).Body;
}

Oder wenn Sie sicher, dass Sie immer nur den Text von E-Mails erhalten möchten, können Sie die Texte in die Tags anstelle der Indizes einfügen könnte.

Andere Tipps

In Ihrem XAML die Listboxen zu binden an die Eigenschaften einrichten Sie möchten, und Event-Handler für, wenn die Auswahl Änderungen eingestellt.

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

Dann im Code zurück. binden die Listboxen auf eine Liste der E-Mail-Objekte.

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

schließlich müssen Sie das Spiel von den Listboxen behandeln.

    private void listbox_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        ListBox listbox = (ListBox)sender;
        foreach (Email email in listbox.SelectedItems)
        {
            textbox1.Text = email.Body;
        }
    }

Bitte beachten Sie diesen Code nicht getestet wird.

Ihr Problem ist nicht mit der E-Mail, aber mit, wie Sie Elemente in Ihrem Formular werden angezeigt wird. Sie versuchen, die Dinge in einer WinForms Weise zu tun, die für WinForms in Ordnung ist (Art), aber wirklich ist sinnlos und Code-schwer in WPF. Sie sollten über MVVM (viele Fragen hier zu diesem Thema) etwas zu lesen tun.

Hier ist eine Demo zeigt, was man nur ein paar Zeilen Code zu tun, wollen verwenden, die den Vorteil der Bindung Infrastruktur von WPF nimmt. Sie können eine neue WPF-Anwendung erstellen und Copypaste die wenigen Zeilen (mein Namespace und Klassennamen ändern, um die Anwendung, die Sie erstellen, um zusammenzupassen!) Und es in Aktion sehen.

Es gibt ein Fenster. Ich simuliert E-Mails hier; Sie würden Ihre E-Mails und steckt sie in der Sammlung bekommen:

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

Ich habe eine ObservableCollection vom Typ FakeEmail zum Fenster hinzugefügt. OCS arbeiten gut mit bindet, wie die Sammlung benachrichtigt bindet, wenn Elemente hinzugefügt oder entfernt werden.

Als nächstes wird das Fenster. Bitte beachten Sie, ich zeige nicht die <Window Definition hier, aber ich habe das Fenster emailClient genannt!

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

Einige der feineren Hinweise: des ListBox Itemssource ist gebunden an die ObservableCollection ich auf dem Fenster definiert. Die List-Box wird für die Einzelteile hören in dieser Sammlung kommen und gehen, und verwenden Sie die Datatemplate UI im colleciton für jedes Element angezeigt werden soll.

Für jede FakeEmail die ItemTemplate findet, erstellt es eine neue Instanz der Datatemplate und Inhalte, und setzt die Datacontext der Vorlage der FakeEmail Instanz. Das heißt, in der Datatemplate kann ich einfach binden an den Eigenschaften einer FakeEmail Instanz und alles wird zur Laufzeit verdrahtet.

Die List-Box hat eine Eigenschaft namens SelectedValue , die ich verwenden kann, die E-Mail-Nachricht zu zeigen. Wenn Sie ein Element in der List-Box auswählen, SelectedValue ist die Instanz von Itemssource, die die Datacontext des Datatemplate ist; dass die derzeit in diesem Elemente in der Benutzeroberfläche angezeigt wird. Also, um die aktuell ausgewählte E-Mail der Nachricht zu zeigen, ich brauche nur zu binden gegen die ItemSource des SelectedValue Nachricht Eigenschaft, da SelectedValue wird die aktuell ausgewählte E-Mail.

Und das ist es. Kein Hören, kein "\ r \ n" BS. Ein paar bindet und eine beobachtbare Sammlung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top