dragan10

Tagプロパティ - Silverlightの外交郵袋

2008-10-13 21:11:21

最近複数の方から、FrameworkElementクラスのTagプロパティがよくわからない、という声をいただきました。

まず注意して欲しいのは、Controlクラス(表示されるすべてのコントロールの基盤)はFrameworkElementから直接導出されているものなので、すべてのコントロールはFrameworkElementでもあり(is-a関係)、したがってTagをもつ(has-a関係)ということです。無条件。追加要求なし。込み込み。タダ。

Tagプロパティは、何かを入れておけるポケットのようなものであり、後で必要になったらいつでも使えるように用意されているものなのです。Tagプロパティは型セーフではありませんが、防水は完璧です。これはとても便利です(そして不要なサブクラスの作成をせずにすませてくれます)。

私の本の技術レビュー者は、Tagプロパティは文字列しかもてないと書いてきたので、私は取り急ぎのプログラムを書いて、そうじゃない、Tagプロパティにはクラスのインスタンスを入れておくこともできるんだ、ということを示しました。2つの問題をのぞけば、とてもうまくいきました:

  • 綺麗に見えるようにするにはその朝の大部分が必要だった
  • 作業を終えた後ドキュメントを見てみたところ(無名のVP候補者もこう言うかもしれません)、「なんてこった、間違ってたじゃないか、確かにドキュメントには文字列しか使えないって書いてある・・・がーん」

[更新:文字列しか使えないという制限はBeta 1のもので、ドキュメントはもうすぐ修正されます]

UIはこんな風になります。

(画面の場所を示せるように、右側に数字を4つ足してあります)

ちょっと脱線:私はドロップダウンのフォントにAlgerianを使うのが好きなんですが、これはSilverlightに組み込まれているフォントではないので、アプリケーションに「埋め込み」しなければなりませんでした。これはBlendを使えばとても簡単で、やり方はBlend User Guide(ヘルプファイル)に書いてあります - ただし、Silverlight2について書かれているところを読むようにしてください。大まかな手順は、Font Managerを立ち上げて、使いたいフォントをチェックして(私の場合はAlgerianです)、必要なサブセットをチェックして(私はすべてのグリフをチェック)、OKをクリックです。

Visual Studioに戻れば、プロジェクトにFontsというフォルダができていて、その中に選択したフォントがあることがわかるでしょう。すばらしい。

これでドロップダウンリストが、こんな感じから

こんな感じになります。

(これが改良と呼べるかどうかはともかく)

Tagの働き

Tagの使い方は単純です。オブジェクトをコントロールのタグに代入しておいて、後で取り出すだけです。タグの中身が肩付きオブジェクトであることを覚えておいて、後で保存した「実体」(つまり実行時の)型にキャストしてやらなければなりません。

意味のあるテストを設定するのは、いつも簡単にいくとは限りません。

私たちのテストフォームの動作は次のようなものです:チェックボックスのチェック、ラジオボタンの選択、プログレッシブ・メタル・バンドをドロップダウンからの選択をします。そして、新しいPersonオブジェクトを生成するのに使うフィールドにデータを入力します。Person.csでは、Personオブジェクトが次のように定義されています:

 public class Person

 {

    public string Name { get; set; }

    public int Age { get; set; }

    public string Email { get; set; }

    public string Skype { get; set; }

    public Person( string name, int age, string email, string skype

    {

       Name = name;

       Age = age;

       Email = email;

       Skype = skype;

    }

 }

pushyボタンを最初にクリックすると、タグが収集され(もしそれらがnullでなければ)、pushyボタン以外のコントロールがすべてdisableになります。もう一度ボタンをクリックすると、Messageテキストボックスを使って、タグの内容を表示します。取り急ぎ作ったプログラムなので、コントロールを操作していなければタグはセットされていません。ということで、申し訳ありませんがPushyボタンを押す前に、すべてのコントロールを操作してくださるようお願いします。実行例はこんな具合です:

- Wicked Coolをチェック (あなたはとてつもなくかっこいい(wicked cool)ですよね?)

- Thing Twoをチェック (私はいつもThing Twoのほうが好きです)

- ドロップダウンリストを開いて、好きなグループを選択。ある理由で、私は矢印キーが一番使いやすいことに気づきました

- 四つのフィールドに記入する。Skypeだけは空欄のままでもいいでしょう

- Pushyを押す

- もう一度Pushyを押す

- 私はこれをどう改善したらいいかを書いて私にメールする(もちろんビデオを作るときに改善します)

コードを順番におっていけば、中身がどうなっているかはだいたいわかると思います(コードはこちら)。

キーになるのは、Pushyボタンの二回目のクリックで、Personオブジェクトを保持しているタグも含め、すべてのタグが取り出されているところです。これで動くように見せるのは、間違った印象を与えているんじゃないかと尋ねる開発者のためのメモ書きを入れてあります。後で触れますが、これでちゃんと動くはずです。

私は自分の年齢を偽りました。私は34歳です。誓って本当です。

で、何に使うの?

ポストの直前に、Austin Avrashowがこの逸話を彼のBlogと共有してくれるというメールをくれました。

 サンドイッチ・カウンターの後ろで働いている英国アクセントの女性に、サンドイッチのひとつの材料について訪ねました。チャツネって聞いたことがありますけど、何にそれを乗せられるんですか?と彼女に言いました。

 彼女は表情をぱっと明るくして言いました。「何にでもよ!」私は彼女に、それじゃあまり答にならないですね、と言いました。

その通り!私はそれが動くことと、その使い方について書きましたが、それが何に使えるかは書いていませんでした。もちろんこれは、大来るの技術的な記事が陥る失敗です。答は・・・後で判断を下すのに役立つけれど、置き場所がない情報を取っておきたいときに使いましょう、ということです。

例えをあげてみましょう。もうすぐ出版される私の本の中で、私はページ内のすべてのオブジェクトに対して、どれが私のコントロールで、どれがそうでないかを示す手段が欲しいと思いました。

私はコントロールを足したり削除したりしますし、レイアウトコントロールをはじめとしてあらゆる種類のコントロールがそのページにはあります。やり方はいろいろありますが、私にとって手早くて簡単な方法は、「捜し物はこちらです」と書かれた情報を、私のコントロールのTagプロパティに入れておく方法でした。

これで、ページの子コレクションから各コントロールを抜き出して、そのコントロールが件の情報を持っていれば、それは私のコントロールだということがわかるので、あとは適切な処理を行うだけです。

大変すばらしく、とても簡単で、"ControlsICareAbout"といった導出クラスを作る必要もありません。

この話はすぐ続きます。

読んでくれてありがとう。

-j

フォロー情報

読者のみなさんへ:ほぼ毎日ポストすることはできると思いますが、1pm締め切りというわけにはいきそうにありません。ということで、締め切りは5pm Easternということにさせていただいて、これより早くポストできるように努力します。

次に、たくさんの「高度な内容はどうなっているの?」といったメールをたくさんいただいています。私がお答えできるのは、「はい、その通り!」RC0とRTWが目前なので、すぐにでてくるという約束はできませんが、この件は優先順位が高くなっているとはお答えできます(入門記事が準次でてくるのと同様に)。

改めて、読んでくれてありがとう。

 


※このエントリは ブロガーにより投稿されたものです。朝日インタラクティブ および ZDNet Japan編集部の見解・意向を示すものではありません。
  • 新着記事
  • 特集
  • ブログ