Domanda

Così ho una casella di riepilogo che mostra l'oggetto di una e-mail (io uso il cliente chilkat imap) quando seleziono oggetto di una e-mail voglio mostrare il corpo del messaggio in una casella di testo ma io riesco a capire come farlo , obviusly io uso l'evento selectindexchanaged casella di riepilogo, ma come potrei andare su di esso

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

grazie in anticipo

È stato utile?

Soluzione

Supponendo che gli indici di posta elettronica rimangono le stesse (credo che il modo più sicuro per assicurarsi di che potrebbe essere quella di memorizzare nella cache il fascio inverosimile nella forma), vorrei cambiare all'utilizzo di un ListView al posto del ListBox e poi ho' d aggiungere gli indici alla lista, sia come una colonna separata o nel Tag degli elementi.

Dopo che ci si imposta il ListView a guardare come avete bisogno di guardare (e ListView.View = View.Details; ListView.MultiSelect = false; sono probabilmente le principali) invece di:

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

si poteva fare qualcosa di simile (se lo fate il modo Tag, che è un po 'più facile, ma alcuni pensano che è male):

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

E poi, quando l'utente seleziona un oggetto nella lista, come dici tu, è gestire l'evento ListView.SelectedIndexChanged e poi basta fare qualcosa di simile:

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

Se sei sicuro di sempre e solo vuole ottenere il testo dai messaggi di posta elettronica, è possibile inserire i testi nei tag al posto degli indici.

Altri suggerimenti

Nel vostro XAML impostare le caselle di riepilogo di legarsi alla proprietà che desideri, e impostare i gestori di eventi per quando cambia la selezione.

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

Poi, nel tuo dietro codice. legano i listboxes ad un elenco degli oggetti di posta elettronica.

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

Infine, è necessario gestire l'evento dalle listboxes.

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

Si prega di notare che questo codice non è testato.

Il problema non è con l'e-mail, ma con come si visualizzano gli elementi nel modulo. Si sta cercando di fare le cose in un modo WinForms, che va bene per WinForms (tipo di), ma è davvero inutile e il codice-pesante in WPF. Si dovrebbe fare qualche lettura su MVVM (un sacco di domande qui sul tema).

Ecco una demo che mostra ciò che si vuole fare usando solo poche righe di codice che sfrutta l'infrastruttura legame di WPF. È possibile creare una nuova app e WPF CopyPaste le poche righe (Modifica Mia nomi dello spazio dei nomi e di classe per abbinare l'applicazione si crea!) E vedere in azione.

C'è una finestra. Sto simulando email qui; si otterrebbe la tua email e metterli nella raccolta:

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

Ho aggiunto un ObservableCollection di tipo FakeEmail alla finestra. OCs funzionano bene con lega, come Notifica agli raccolta lega quando gli elementi vengono aggiunti o rimossi.

Avanti, la finestra. Si prega di notare, non sto mostrando la definizione <Window qui, ma ho chiamato la finestra 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>

Alcune delle note più fini: del ListBox ItemsSource è legata alla ObservableCollection ho definito sulla finestra. Il ListBox ascolterà per gli elementi che vanno e vengono in quella raccolta, e utilizzare il DataTemplate per visualizzare interfaccia utente per ogni elemento nella colleciton.

Per ogni FakeEmail i reperti ItemTemplate, crea una nuova istanza di DataTemplate e contenuti, e imposta il DataContext del modello per l'istanza FakeEmail. Ciò significa che, all'interno del DataTemplate posso semplicemente legare contro le proprietà di un'istanza FakeEmail e tutto viene cablato in fase di esecuzione.

Il ListBox ha una proprietà chiamata SelectedValue , che posso usare per mostrare il messaggio di posta elettronica. Quando si seleziona una voce nella casella di riepilogo, SelectedValue è l'istanza da ItemsSource che è il DataContext del DataTemplate; ciò che è attualmente visualizzato in tale elemento nell'interfaccia utente. Così, al fine di mostrare il messaggio della posta elettronica attualmente selezionata, ho solo bisogno di impegnare contro di del ItemSource SelectedValue Messaggio di proprietà, dal momento che SelectedValue sarà l'email attualmente selezionato.

E questo è tutto. No ascolto, nessun "\ r \ n" BS. Un paio di lega e una collezione osservabile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top