まず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 件のコメント:
コメントを投稿