2010年3月15日月曜日

番外編 細かいいろいろ

今回は大きなトピックはないものの、以下の3点を追加修正しました。
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

1 件のコメント:

  1. 書き忘れました。
    アプリ名に入れている"すとれおじさん"はとりあえずの仮名です。
    Twitterというワードが入っているとOAuth認証とれないので。。

    返信削除