Silverlightでのレポーティング

/ C#, Silverlight

Silverlight4は簡易的な帳票出力に対応していて、UIElementを丸ごとプリンタに送り出せることは知っていたのですが、複数ページの出力はどうやるのか、いまいちイメージが沸かなかったので試してみることに。

PrintPageイベントがページ単位に発動されるのが混乱を招く感じですが、基本的にはページ毎にUIElementを設定してあげれば良い模様。
多少汎用的に書くとしたら、以下のような感じに書けば良いかと。

private List<UIElement> pageElement;

private void button1_Click(object sender, RoutedEventArgs e)
{
	//ページコンテンツ設定
	pageElement = new List<UIElement>() { txtPage1, txtPage2 };

	//印刷指示
	var pd = new PrintDocument();
	pd.Print("PrintTest");

	//印刷処理
	pd.PrintPage += (s, args) =>
	{
		//カレントページにコンテンツを設定
		args.PageVisual = pageElement[0];

		//カレントコンテンツを削除
		pageElement.RemoveAt(0);

		//次ページ有無チェック
		args.HasMorePages = (pageElement.Count > 0);
	};
}

このコードでは、テキストボックス txtPage1、txtPage2 をそれぞれ別ページに出力していますが、任意のUIElementを設定してあげれば、それがページのコンテンツになるという仕組みです。
ページコンテンツの中身は如何様にもカスタマイズできてしまうわけだし、プレビューの仕組みもそれほど難しくないと思われるので、このレポーティング機能、案外業務アプリでも使えるかもしれません。


電力使用率アプリ

/ C#, Silverlight

もはやあちこちのサイトに貼られてる東電の電力使用率表示ですが、リハビリがてらSilverlightで書いてみました。

データの取得には東京電力電力供給状況APIを使わせていただいたので、コード自体はほんの数行で出来上がりです。(以下、抜粋。XAMLも割愛)

using System.Json;

private void GetUsage()
{
	var wc = new WebClient();
	var url = "http://tepco-usage-api.appspot.com/latest.json";

	wc.DownloadStringAsync(new Uri(url));
	wc.DownloadStringCompleted += (s, args) =>
	{
		var data = JsonObject.Parse(args.Result);

		tbTime.Text = string.Format("{0:M/d H:mm}", DateTime.Parse(data["usage_updated"]).ToLocalTime());
		tbUsage.Text = string.Format("{0:0.0%}", (double)data["usage"] / (double)data["capacity"]);
	};
}

データの更新は毎時1回とのことなので自動更新は端折りましたが、更新日時の部分をクリックするとデータを再取得するようにしてあります。
でもって、計画停電中は背景色がレッド、停電していない場合はブルー表示になります。

みてくれがイマイチだけども、せっかくなのでウィジェットとしてサイドバーに貼っておくことにしませう。