1

したがって、電子メールの件名を選択すると、電子メールの件名を表示するリストボックスがあります(私はchilkat imapクライアントを使用します)。テキストボックスにメッセージ本文を表示したいのですが、どうすればよいかわかりません。リストボックス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();
    }
}

前もって感謝します

4

3 に答える 3

2

電子メールのインデックスが同じままであると仮定すると(それを確認する最も安全な方法は、フェッチされたバンドルをフォームにキャッシュすることだと思います)、の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;
}

または、電子メールからテキストを取り出したいだけだと確信している場合は、インデックスの代わりにタグにテキストを挿入することができます。

于 2010-09-10T22:14:56.207 に答える
1

xamlで、必要なプロパティにバインドするリストボックスを設定し、選択が変更されたときのイベントハンドラーを設定します。

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

次に、コードビハインドで。リストボックスを電子メールオブジェクトのリストにバインドします。

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

最後に、リストボックスからイベントを処理する必要があります。

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

このコードはテストされていないことに注意してください。

于 2010-09-08T21:36:14.940 に答える
1

問題はメールではなく、フォームでのアイテムの表示方法にあります。あなたはwinformsの方法で物事を行おうとしています。これは、winforms(一種)には問題ありませんが、WPFでは実際には無意味でコードが重いです。あなたはMVVMについていくらか読むべきです(この主題に関するたくさんの質問がここにあります)。

これは、WPFのバインディングインフラストラクチャを利用する数行のコードのみを使用して実行したいことを示すデモです。新しいWPFアプリを作成し、数行をコピーして貼り付け(作成したアプリに一致するように名前空間とクラス名を変更してください!)、実際の動作を確認できます。

ウィンドウが1つあります。ここではメールをシミュレートしています。メールを受け取り、コレクションにダンプします。

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

FakeEmailタイプのObservableCollectionをウィンドウに追加しました。OCは、要素が追加または削除されたときにコレクションがバインドに通知するため、バインドで適切に機能します。

次に、ウィンドウ。<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>

細かい点のいくつか:ListBoxのItemsSourceは、ウィンドウで定義したObservableCollectionにバインドされています。ListBoxは、そのコレクションで出入りするアイテムをリッスンし、DataTemplateを使用してコレクション内の各アイテムのUIを表示します。

ItemTemplateが検出したFakeEmailごとに、DataTemplateとコンテンツの新しいインスタンスを作成し、テンプレートのDataContextをFakeEmailインスタンスに設定します。つまり、DataTemplate内で、FakeEmailインスタンスのプロパティにバインドするだけで、実行時にすべてが接続されます。

ListBoxにはSelectedValueというプロパティがあり、これを使用して電子メールメッセージを表示できます。ListBoxでアイテムを選択すると、SelectedValueは、DataTemplateのDataContextであるItemsSourceからのインスタンスになります。UIのそのアイテムに現在表示されているもの。したがって、現在選択されている電子メールのメッセージを表示するには、SelectedValueが現在選択されている電子メールになるため、ItemSourceのSelectedValueのMessageプロパティに対してバインドする必要があります。

以上です。リスニングなし、「\ r\n」BSなし。カップルがバインドし、Observableコレクション。

于 2010-09-13T10:57:59.817 に答える