.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 には Windows 上で動く手前、そのほとんどが DirectX で描画されている一方で、Win32 時代の遺産を利用できるようにするために、System.Windows.Interop.HwndHost という相互運用機構が用意されています。これを実装するコントロールを利用することで WPF でも ActiveX や Windows Forms のコントロールを利用することができるようになっています。そして Web ページを表示する機能を持つ WebBrowser コントロールも同様に HwndHost の派生クラスです。

HwndHostFrameworkElement の派生クラスでこそありますが、継承しているプロパティの多くが他の WPF コントロールのようには動作しません。透明度や変形といった WPF 特有の機能のほか、スクロール領域や要素の切り取り、重ね合わせといったレイアウトにも対応していません。これはたとえば次のような例で問題が起きます。

この記事は、ヒナロエ氏(@hnle0)の Advent Calendar 2014 参加記事(7 日目)です。

2015年2月2日より API 経由での情報取得が可能になるようです。
詳細は当記事下部の追記にて。

というわけで

今回は、ちょっと前から Twitter にアップロードできるようになった GIF アニメを取得する方法を考えてみます。記事執筆時点(2014/12/16)では Twitter はサードパーティーのクライアント向けにはこれを公開していません。

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 ではアイテムをスクロールするときに、アイテム単位でのスクロールが行われます。アイテム単位でのスクロールでは、ボックスからはみ出てしまった文字を読むことができないほか、アイテムによって高さが違う場合、スクロールしたときに読みにくくなってしまいます。