Question

J'ai donc une zone de liste qui montre l'objet d'un e-mail (j'utilise le client chilkat imap) lorsque je sélectionne l'objet d'un e-mail que je veux montrer le corps du message dans une zone de texte, mais je ne peux pas comprendre comment le faire , obviusly i utiliser la liste événement selectindexchanaged mais comment pourrais-je aller à ce sujet

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

Merci à l'avance

Était-ce utile?

La solution

En supposant que les indices de messagerie restent les mêmes (je pense que la meilleure façon de vous assurer de cela serait de mettre en cache le faisceau récupéré sous la forme), je changerais d'utiliser un ListView au lieu du ListBox puis I » d ajouter les index de la liste, soit dans une colonne distincte ou dans le Tag des articles.

Une fois que vous souhaitez mettre en place le ListView à regarder comme vous en avez besoin pour regarder (ListView.View = View.Details; et ListView.MultiSelect = false; sont probablement les principaux) au lieu de:

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

vous pouvez faire quelque chose comme (si vous le faites de la façon Tag, ce qui est un peu plus facile, mais certaines personnes pensent est mauvais):

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

Et puis lorsque l'utilisateur sélectionne un sujet dans la liste, comme vous le dites, vous gérer l'événement ListView.SelectedIndexChanged puis juste faire quelque chose comme:

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

Ou si vous êtes sûr que vous ne voulez jamais sortir le texte des e-mails, vous pouvez insérer les textes dans les balises au lieu des indices.

Autres conseils

Dans votre XAML mis en place les listboxes se lier aux propriétés que vous souhaitez, et mettre en place des gestionnaires d'événements lorsque les changements de sélection.

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

Ensuite, dans votre derrière de code. lier les listboxes à une liste des objets de courrier électronique.

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

Enfin, vous devez gérer l'événement des listboxes.

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

S'il vous plaît noter que ce code n'est pas testé.

Votre question n'est pas avec l'e-mail, mais la façon dont vous affichez des éléments dans votre formulaire. Vous essayez de faire les choses d'une manière WinForms, ce qui est bien pour WinForms (genre de) mais est vraiment inutile et code lourd dans WPF. Vous devriez faire quelques lectures sur MVVM (beaucoup de questions ici sur le sujet).

Voici une démo montrant ce que vous voulez faire en utilisant seulement quelques lignes de code qui profite de l'infrastructure de liaison de WPF. Vous pouvez créer une nouvelle application WPF et copypaste les quelques lignes (modifier mes espaces de noms et noms de classe pour correspondre à l'application que vous créez!) Et le voir en action.

Il y a une fenêtre. Je simuler des e-mails ici; vous obtiendrez vos e-mails et les jeter dans la collection:

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

J'ai ajouté un ObservableCollection de type FakeEmail à la fenêtre. CO fonctionnent bien avec les lie, comme la collection Notifie se lie lorsque des éléments sont ajoutés ou supprimés.

Ensuite, la fenêtre. S'il vous plaît noter que je ne suis pas montrer la définition de <Window ici, mais je l'ai nommé la fenêtre 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>

Certains des notes plus fines: de la zone de liste ItemsSource est lié à la ObservableCollection I définie dans la fenêtre. Le ListBox écoutera les articles qui vont et viennent dans cette collection, et utiliser le DataTemplate pour afficher l'interface utilisateur pour chaque élément de la colleciton.

Pour chaque FakeEmail les trouvailles ItemTemplate Les, il crée une nouvelle instance de DataTemplate et le contenu, et définit la DataContext du modèle à l'instance FakeEmail. Cela signifie que, dans le I DataTemplate peuvent simplement se lier contre les propriétés d'une instance FakeEmail et tout est câblé lors de l'exécution.

Le ListBox possède une propriété appelée SelectedValue , que je peux utiliser pour afficher le message électronique. Lorsque vous sélectionnez un élément dans la zone de liste, SelectedValue est l'instance de ItemsSource qui est le DataContext du DataTemplate; ce qui est actuellement affichée dans cet élément dans l'interface utilisateur. Ainsi, afin de montrer le message de courrier électronique sélectionné, je juste besoin de se lier contre Message propriété du ItemSource SelectedValue, puisque SelectedValue sera l'e-mail sélectionné.

Et voilà. Pas d'écoute, pas "\ r \ n" BS. A se lie d'un couple et d'une collection observable.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top