.NET Framework から利用可能なライブラリ「NowPlayingLib」を公開しました。 Windows 上で動作している音楽プレーヤーと連携して、再生中の曲の情報を取得したり、基本的な操作を行ったりすることができるライブラリです。次の音楽プレーヤーに対応しています。

  • Windows Media Player
  • iTunes
  • x-アプリ
  • LISMO Port(x-アプリ for LISMO)
  • foobar2000(要 COM Automation server コンポーネント)

ライブラリならびにソースコードは GitHub 上で MIT ライセンスで公開されています。
https://github.com/chitoku-k/NowPlayingLib

注意

  • このライブラリーは .NET Framework 4.5 のみに対応しています。
  • アルバムアートワークは foobar2000 では取得できません。

WPF でインターネット上にある画像を表示させる場合、その URI を BitmapImage に指定することで表示することができます。

<Image>
    <Image.Source>
        <BitmapImage UriSource="https://chitoku.jp/media/icon.png" />
    </Image.Source>
</Image>
var img = new Image();
img.Source = new BitmapImage(new Uri("https://chitoku.jp/media/icon.png"));
var img = new Image();
var source = new BitmapImage();
source.BeginInit();
source.UriSource = new Uri("https://chitoku.jp/media/icon.png");
source.EndInit();
img.Source = source;

でもこの BitmapImage における読み込み処理は UI スレッドで行われているようです。つまり、画像のダウンロードに時間がかかったり、画像の数が多かったりすると、他の要素の表示速度にも影響を与えることがあるということです。今回は、XAML 側から利用できるバッググラウンド処理の機構を考えてみます。

今回は .NET Framework で動作する UI フレームワーク、WPF 4 のお話です。

WPF では大量のアイテムを表示するために ItemsControl というコントロールが用いられますが、多くのアイテムを描画するには時間がかかる上、パフォーマンスの悪化にもつながります。そこで WPF ではアイテムを高速かつ省メモリで描画するために、UI 仮想化という機能が用意されており、ItemsControl の派生コントロールである ListBox などではこれが既定でオンになっています。やったぜ!

というわけにもいかず……本題はここからです。
ListBox ではアイテムをスクロールするときに、アイテム単位でのスクロールが行われます。アイテム単位でのスクロールでは、ボックスからはみ出てしまった文字を読むことができないほか、アイテムによって高さが違う場合、スクロールしたときに読みにくくなってしまいます。