0

クライアントとサーバーがあります。サーバーは、デスクトップからアプリケーションのリスト (それぞれにパス、名前、およびアイコンを含む) を取得します。次に、アプリケーションをクライアントに送り返し、LargeIcons を使用して ListView に表示されるようにします。これにより、クライアントはリストビューのデスクトップ アイコンをダブルクリックして、そのアプリケーションをサーバー上で開くことができます。(これは、以下のバグを処理すると 100% 機能します...)

ただし、シリアル化されたアイコンが逆シリアル化されると劣化する Microsoft のバグがあります ( http://support.microsoft.com/kb/814735 ) 。

高品質のアイコンを元に戻すために、そこで与えられたアドバイスに従おうとしています。

これが私がやっていることです:

//Get the list of Applications, which will include an icon, which we'll ignore due to the bug.
List<App> apps = client.ServiceProxy.getDesktopShortcuts();
// Get the ImageListStreamer (The serializable portion of the ImageList) and assign it to our Image List
ImageListStreamer il = client.ServiceProxy.getDesktopIcons();

foreach (App app in apps){
    ListViewItem item = new ListViewItem(app.name);
    item.ImageKey = app.path;
    lv.Items.Add(item);
}

getDesktopIcons() で ImageList にアイコンを追加するときは、次のようにします。

il.Images.Add(app.path, app.icon);

アプリケーションのパスをキーにするためです。ただし、画像ストリームだけをクライアントに送り返すと、その重要な情報が失われると思います。各 App オブジェクトにアプリのパスがあるので、それらを順番に、イメージリストのそれぞれのアイコンに関連付けるにはどうすればよいですか?

4

1 に答える 1

0

答えは簡単でした。List と ImageList の両方が同じ順序で構築されているため、与えられたアプリをループすると、Apps[0] が ImageList[0] に対応すると想定しても安全です。

したがって、私は単に使用する必要があります

il.Images.SetKeyName(i, app.path);

設定する画像のインデックス付き(アプリに対応)。

于 2012-06-08T17:00:02.020 に答える