1.名前をクリックしたときに、Webページではなく、ローカルに持っているその人のつぶやきを集めて表示
2.アイコンの指定を外部Xamlファイルに移動
3.オプションダイアログにバージョン情報のページを追加
まず1の変更から。
正直、変更前とどちらが使いやすいかは、自分でもしばらく使ってみないとわからないのですが。。
変更はすごく簡単です。
キャッシュをすでに持っている(TimelineItemVMCacheくらす)ので、
そこに、特定のユーザーのつぶやき一覧を取得するメソッドを追加します。
/// <summary> /// 指定したユーザーのすべてのアイテム(発言)を取得 /// </summary> /// <param name="userName">取得したいユーザーの名前</param> /// <returns></returns> public IEnumerable<TimelineItemViewModel> GetAllItemsOf(string userName) { foreach (var item in _items) { if (item.Name == userName) { yield return item; } } }
あとはTimelineItemViewModelにShowUsersAllItemCommandコマンドを作って
リンククリック時のコマンドをこちらに変更しています。
あたらしいWindowで開くのは既存の仕組みを使っています。
ちなみにこれまでの「ブラウザで開く」は右クリックメニューに追加しています。
2の変更について。
まず注意として、アイコンのフォルダをSkinsフォルダの下に移動しています。
これはxamlファイルからの相対位置指定になるみたいだからです。
以下のようなxamlファイルを作ります。
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <BitmapImage x:Key="AppImage" UriSource="icons/32x32/chess.png"/> <BitmapImage x:Key="SubmitImage" UriSource="icons/32x32/comment.png"/> <BitmapImage x:Key="SettingImage" UriSource="icons/32x32/tools.png"/> <BitmapImage x:Key="CommentsImage" UriSource="icons/16x16/comments.png"/> <BitmapImage x:Key="ReTweetImage" UriSource="icons/16x16/megaphone.png"/> <BitmapImage x:Key="ReturnMessageImage" UriSource="icons/16x16/mail_send.png"/> </ResourceDictionary>
前回SkinsフォルダのxamlファイルはすべてResourceとして読み込まれるようにしていたので、
上記ファイルも自動で読み込まれます。
各BitmapImageを使っていた場所は以下のように
アプリケーションのResourceから取得するように変更しています。
#region static member private static BitmapImage _replyImage = App.Current.FindResource("CommentsImage") as BitmapImage; private static BitmapImage _reTweetImage = App.Current.FindResource("ReTweetImage") as BitmapImage; private static BitmapImage _replyToMailImage = App.Current.FindResource("ReturnMessageImage") as BitmapImage; #endregion
Windowにもアイコンが付くようにしました。
しかしWindowのアイコンは上記方法では指定できなかったので、
AppクラスのOnStartUpに直接以下のように書いています
mainWindow.Icon = BitmapFrame.Create(new Uri(baseUri + @"\Skins\icons\32x32\chess.png"));
これでユーザーがアイコンを変更しやすくなると思います。
3の変更について
バージョン情報とかはAssemblyInfo.csで管理すべきなのかもしれませんが、
ぶっちゃけここで指定するとXAMLやコードで読み込むのがめんどくさそうだったので、
(本当は簡単なやりかたがあるのかもしれません)
というわけで、アプリケーション情報をもつクラスを作って、
/// <summary> /// 使用しているライブラリ等の情報 /// </summary> class RefLib { /// <summary> /// /// </summary> /// <param name="name">ライブラリ名</param> /// <param name="url">参照URL</param> /// <param name="useFor">このアプリでの使用目的</param> public RefLib(string name, string url, string useFor) { Name = name; Url = url; UseFor = useFor; } public string Name { get; set; } public string Url { get; set; } public string UseFor { get; set; } } /// <summary> /// アプリケーション情報 /// </summary> class AppInfo { public const string AppName = "すとれおじさん"; public const string Version = "0.01"; public const string Copyright = "Copyright © 2010 yuki"; public const string Url = "http://wtwitter.codeplex.com/"; public static RefLib[] RefLibs = new RefLib[] { new RefLib("OAuthLib", "http://oauthlib.codeplex.com/", "OAuth認証"), new RefLib("DryIcons", "http://dryicons.com/", "アイコン"), }; }
一応AppInfo.csに渡します。
[assembly: AssemblyProduct(AppInfo.AppName)] [assembly: AssemblyCopyright(AppInfo.Copyright)]
実際のバージョン情報の表示はUserControlを1個作って、
<UserControl x:Class="WTwitter.View.AboutView" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:app="clr-namespace:WTwitter" xmlns:util="clr-namespace:WTwitter.ViewModel.Utility"> <StackPanel> <GroupBox Header="バージョン情報" Margin="3" Padding="3"> <StackPanel> <StackPanel Orientation="Horizontal"> <TextBlock Text="{x:Static app:AppInfo.AppName}" FontWeight="Bold" /> <TextBlock> Version </TextBlock> <TextBlock Text="{x:Static app:AppInfo.Version}"/> </StackPanel> <TextBlock> <Run>URL: </Run> <Hyperlink Command="{x:Static util:CommonCommands.OpenByBrowser}" CommandParameter="{x:Static app:AppInfo.Url}"> <TextBlock Text="{x:Static app:AppInfo.Url}"/> </Hyperlink> </TextBlock> </StackPanel> </GroupBox> <GroupBox Header="このアプリケーションで利用しているライブラリ" Margin="3" Padding="3"> <ItemsControl ItemsSource="{x:Static app:AppInfo.RefLibs}"> <ItemsControl.ItemTemplate> <DataTemplate> <StackPanel Margin="3"> <TextBlock Text="{Binding Path=UseFor}"/> <StackPanel Margin="10,0,0,0"> <TextBlock Text="{Binding Path=Name}" FontWeight="Bold"/> <TextBlock> <Hyperlink Command="{x:Static util:CommonCommands.OpenByBrowser}" CommandParameter="{Binding Path=Url}"> <TextBlock Text="{Binding Path=Url}"/> </Hyperlink> </TextBlock> </StackPanel> </StackPanel> </DataTemplate> </ItemsControl.ItemTemplate> </ItemsControl> </GroupBox> </StackPanel> </UserControl>
OptionDialogではそれをおいているだけです。
<TabItem Header="バージョン情報"> <view:AboutView/> </TabItem>
ブラウザで開くコマンドはよく使うので
CommonCommandsというクラスを作って、staticメンバとして入れました。
XAMLの表示がやや悩みましたが、x:Staticを使えばできました。
今回のソースコード
http://wtwitter.codeplex.com/SourceControl/changeset/view/43119
書き忘れました。
返信削除アプリ名に入れている"すとれおじさん"はとりあえずの仮名です。
Twitterというワードが入っているとOAuth認証とれないので。。