2010年1月27日水曜日

第10回 ハイパーリンクを作る

今回は名前をクリックしたら、そのユーザのタイムラインをブラウザで表示するようにしてみたいと思います。

まずTimelineItemViewModelに、そのユーザのタイムラインのURLを返すプロパティを追加します。


  public string UserUrl {
   get { return string.Format(@"http://www.twitter.com/{0}",Name); }
  }



次にイベントが発生する仕組みを作ります。
ビューの名前の部分にClickイベントを作るのが一番早いのですが、
WPFにはコマンドというものが用意されています。
注意が必要なのは、Commandクラス自体はシンボルのようなもので、機能(動作)は持ちません。
例えば、Windouwsは一般的にCtrl+Cで『コピー』コマンドを実行できますが、
動作は、テキスト選択中の場合とファイル選択中の場合では違いますよね?
コマンドとその動作を結びつけるのがCommandBindingです。
ビューやコントロールがCommandBindingを持っていて、
このコマンドが要求されたときはこのメソッドを呼ぶ、というような関連づけがされています。
まずコマンドを作ります。


namespace WTwitter.Command {
 public class Commands {
  static public RoutedUICommand OpenByBrowser
   = new RoutedUICommand("タイムラインをブラウザで開く", "OpenByBrowser", typeof(Commands));
 }
}




コマンドはアプリケーション全体で共用して利用されることが多いので、
staticで宣言されることが多いようです。

RoutedUICommandを使っていますが、Routedがついていると、
そのコントロールでコマンドが処理されなかったとき親のコントロールに処理を依頼します。

※書いている時点で思いましたが、コマンドのクラスもフィールドを直接見せないで
プロパティにした方がいいと思います。そのうち修正します。

最後にTimelineViewを変更します。
まずUserControlのCommandBindingに先ほど作ったコマンドを登録します。
これで、コマンドが実行されたらCommandBinding_Executed()が呼び出されます。


 <UserControl.CommandBindings>
  <CommandBinding Command="{x:Static command:Commands.OpenByBrowser}" Executed="CommandBinding_Executed"/>
 </UserControl.CommandBindings>



次に、名前をHyperLinkにしてコマンドを発行するようにします。
Textboxの中にHyperlink、さらに中にTextboxを配置するまどろっこしい形になっているのは
HyperlinkとBindingを使いたい場合はしょうがないみたいです。


      <TextBlock DockPanel.Dock="Top">
       <Hyperlink Command="{x:Static command:Commands.OpenByBrowser}" CommandParameter="{Binding Path=UserUrl}" >
        <TextBlock Text="{Binding Path=Name}"/>
       </Hyperlink>
      </TextBlock>



最後に、ブラウザの呼び出し部分


  private void CommandBinding_Executed(object sender, ExecutedRoutedEventArgs e) {
   Process.Start(e.Parameter as string);
  }



今回のコード
http://wtwitter.codeplex.com/SourceControl/changeset/view/39432

0 件のコメント:

コメントを投稿