読者です 読者をやめる 読者になる 読者になる

SourceChord

C#とXAML好きなプログラマの備忘録。最近はWPF系の話題が中心です。

WPFの開発用にコードスニペットを登録する

WPFのアプリ開発に役立ちそうなコードスニペットを作ってみました。
作ったのは、こんな感じのコードスニペットとか。
f:id:minami_SC:20140211231913p:plain

コードスニペットの作成方法は、↓の記事が参考になりました。
http://www.tk4.co.jp/develop/codesnippet/recipe.html

コードスニペットの内容をxmlで書いて、.snippetという拡張子で保存し、↓の場所に保存すればよいみたい(C#用の場合)
[Documentsのフォルダ]\Visual Studio 2013\Code Snippets\Visual C#\My Code Snippets

ルーティンングイベント用のコードスニペット

依存関係プロパティや添付プロパティ用のコードスニペットは標準で入っているのに、
ルーティングイベント用のコードスニペットはありません。
ってことで、まずはルーティングイベント用のコードスニペット

↓のサイトを真似して作ってみました。
http://interactiveasp.net/blogs/natesstuff/archive/2008/10/15/routed-event-code-snippet.aspx

  <CodeSnippet Format="1.0.0">
    <Header>
      <Title>ルーティングイベントを定義します。</Title>
      <Shortcut>revent</Shortcut>
      <Description>ルーティングイベント用のコードスニペット</Description>
      <Author>minami_SC</Author>
      <SnippetTypes>
        <SnippetType>Expansion</SnippetType>
      </SnippetTypes>
    </Header>
    <Snippet>
      <Declarations>
        <Literal>
          <ID>eventhandlertype</ID>
          <ToolTip>イベントハンドラの型</ToolTip>
          <Default>RoutedEventHandler</Default>
        </Literal>
        <Literal>
          <ID>name</ID>
          <ToolTip>イベント名</ToolTip>
          <Default>MyEvent</Default>
        </Literal>
        <Literal>
          <ID>ownerclass</ID>
          <ToolTip>このイベントを所有しているクラスです。通常は、対応する宣言が存在するクラスです。</ToolTip>
          <Default>ownerclass</Default>
        </Literal>
        <Literal>
          <ID>routingstratigy</ID>
          <ToolTip>ルーティングイベントのルーティング方法</ToolTip>
          <Default>Bubble</Default>
        </Literal>
      </Declarations>
      <Code Language="csharp">
        <![CDATA[

public event RoutedEventHandler $name$
{
        add { AddHandler($name$Event, value); } 
        remove { RemoveHandler($name$Event, value); }
}
public static readonly RoutedEvent $name$Event = EventManager.RegisterRoutedEvent(
    "$name$", RoutingStrategy.$routingstratigy$, typeof($eventhandlertype$), typeof($ownerclass$));

$end$]]>
      </Code>
    </Snippet>
  </CodeSnippet>

RelayCommand用のコードスニペット

以前↓の記事で書いた、RelayCommandですが、
これを使う時も結構な量のコードを書かないといけなくて面倒なので、コードスニペットにしてみました。
XAMLからViewModelのメソッドにバインドする~RelayCommand~ - SourceChord
引数なしのRelayCommandと、任意の型の引数を一つ受けるRelayCommand用のスニペットを作りました。

  <CodeSnippet Format="1.0.0">
    <Header>
      <Title>RelayCommandを定義します。</Title>
      <Shortcut>rcmd</Shortcut>
      <Description>RelayCommand用のコードスニペット</Description>
      <Author>minami_SC</Author>
      <SnippetTypes>
        <SnippetType>Expansion</SnippetType>
      </SnippetTypes>
    </Header>
    <Snippet>
      <Declarations>
        <Literal>
          <ID>commandfield</ID>
          <ToolTip>コマンドのバッキング変数</ToolTip>
          <Default>myCommand</Default>
        </Literal>
        <Literal>
          <ID>commandname</ID>
          <ToolTip>コマンド名</ToolTip>
          <Default>MyCommand</Default>
        </Literal>
      </Declarations>
      <Code Language="csharp">
        <![CDATA[

private RelayCommand $commandfield$Command;
public RelayCommand $commandname$Command
{
    get { return $commandfield$Command = $commandfield$Command ?? new RelayCommand($commandname$); }
}

private void $commandname$()
{
}

$end$]]>
      </Code>
    </Snippet>
  </CodeSnippet>
  <CodeSnippet Format="1.0.0">
    <Header>
      <Title>RelayCommand&lt;T&gt;を定義します。</Title>
      <Shortcut>rcmdg</Shortcut>
      <Description>RelayCommand&lt;T&gt;用のコードスニペット</Description>
      <Author>minami_SC</Author>
      <SnippetTypes>
        <SnippetType>Expansion</SnippetType>
      </SnippetTypes>
    </Header>
    <Snippet>
      <Declarations>
        <Literal>
          <ID>type</ID>
          <ToolTip>引数の型</ToolTip>
          <Default>string</Default>
        </Literal>
        <Literal>
          <ID>commandfield</ID>
          <ToolTip>コマンドのバッキング変数</ToolTip>
          <Default>myCommand</Default>
        </Literal>
        <Literal>
          <ID>commandname</ID>
          <ToolTip>コマンド名</ToolTip>
          <Default>MyCommand</Default>
        </Literal>
      </Declarations>
      <Code Language="csharp">
        <![CDATA[

private RelayCommand<$type$> $commandfield$Command;
public RelayCommand<$type$> $commandname$Command
{
    get { return $commandfield$Command = $commandfield$Command ?? new RelayCommand<$type$>($commandname$); }
}

private void $commandname$($type$ parameter)
{
}

$end$]]>
      </Code>
    </Snippet>
  </CodeSnippet>

BindableBaseと組み合わせたとき用のコードスニペット

以前↓で書いた、BindableBase派生クラス用のプロパティのスニペットです。
WPFでもBindableBaseを使ってINotifyPropertyChangedを実装する - SourceChord

  <CodeSnippet Format="1.0.0">
    <Header>
      <Title>BindableBase派生プロパティを定義します。</Title>
      <Shortcut>propbb</Shortcut>
      <Description>BindableBaseから派生したプロパティのコードスニペット</Description>
      <Author>minami_SC</Author>
      <SnippetTypes>
        <SnippetType>Expansion</SnippetType>
      </SnippetTypes>
    </Header>
    <Snippet>
      <Declarations>
        <Literal>
          <ID>type</ID>
          <ToolTip>プロパティ型</ToolTip>
          <Default>int</Default>
        </Literal>
        <Literal>
          <ID>fieldname</ID>
          <ToolTip>このプロパティのバッキング変数</ToolTip>
          <Default>myVar</Default>
        </Literal>
        <Literal>
          <ID>propertyname</ID>
          <ToolTip>プロパティ名</ToolTip>
          <Default>MyProperty</Default>
        </Literal>
      </Declarations>
      <Code Language="csharp">
        <![CDATA[

private $type$ $fieldname$;
public $type$ $propertyname$
{
    get { return $fieldname$; }
    set { this.SetProperty(ref this.$fieldname$, value); }
}

$end$]]>
      </Code>
    </Snippet>
  </CodeSnippet>

まとめ

この辺をまとめて一つのファイルにしておきました。
ショートカットなどは以下の通り。

ショートカット 内容
revent ルーティングイベントの作成
rcmd RelayCommandの作成
rcmdg RelayCommandの作成
propbb BindableBase派生クラス用の、更新通知付プロパティの作成
WpfSnippets.snippet
<?xml version="1.0" encoding="utf-8" ?>
<CodeSnippets  xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
  <CodeSnippet Format="1.0.0">
    <Header>
      <Title>ルーティングイベントを定義します。</Title>
      <Shortcut>revent</Shortcut>
      <Description>ルーティングイベント用のコードスニペット</Description>
      <Author>minami_SC</Author>
      <SnippetTypes>
        <SnippetType>Expansion</SnippetType>
      </SnippetTypes>
    </Header>
    <Snippet>
      <Declarations>
        <Literal>
          <ID>eventhandlertype</ID>
          <ToolTip>イベントハンドラの型</ToolTip>
          <Default>RoutedEventHandler</Default>
        </Literal>
        <Literal>
          <ID>name</ID>
          <ToolTip>イベント名</ToolTip>
          <Default>MyEvent</Default>
        </Literal>
        <Literal>
          <ID>ownerclass</ID>
          <ToolTip>このイベントを所有しているクラスです。通常は、対応する宣言が存在するクラスです。</ToolTip>
          <Default>ownerclass</Default>
        </Literal>
        <Literal>
          <ID>routingstratigy</ID>
          <ToolTip>ルーティングイベントのルーティング方法</ToolTip>
          <Default>Bubble</Default>
        </Literal>
      </Declarations>
      <Code Language="csharp">
        <![CDATA[

public event RoutedEventHandler $name$
{
        add { AddHandler($name$Event, value); } 
        remove { RemoveHandler($name$Event, value); }
}
public static readonly RoutedEvent $name$Event = EventManager.RegisterRoutedEvent(
    "$name$", RoutingStrategy.$routingstratigy$, typeof($eventhandlertype$), typeof($ownerclass$));

$end$]]>
      </Code>
    </Snippet>
  </CodeSnippet>
  <CodeSnippet Format="1.0.0">
    <Header>
      <Title>RelayCommandを定義します。</Title>
      <Shortcut>rcmd</Shortcut>
      <Description>RelayCommand用のコードスニペット</Description>
      <Author>minami_SC</Author>
      <SnippetTypes>
        <SnippetType>Expansion</SnippetType>
      </SnippetTypes>
    </Header>
    <Snippet>
      <Declarations>
        <Literal>
          <ID>commandfield</ID>
          <ToolTip>コマンドのバッキング変数</ToolTip>
          <Default>myCommand</Default>
        </Literal>
        <Literal>
          <ID>commandname</ID>
          <ToolTip>コマンド名</ToolTip>
          <Default>MyCommand</Default>
        </Literal>
      </Declarations>
      <Code Language="csharp">
        <![CDATA[

private RelayCommand $commandfield$Command;
public RelayCommand $commandname$Command
{
    get { return $commandfield$Command = $commandfield$Command ?? new RelayCommand($commandname$); }
}

private void $commandname$()
{
}

$end$]]>
      </Code>
    </Snippet>
  </CodeSnippet>
  <CodeSnippet Format="1.0.0">
    <Header>
      <Title>RelayCommand&lt;T&gt;を定義します。</Title>
      <Shortcut>rcmdg</Shortcut>
      <Description>RelayCommand&lt;T&gt;用のコードスニペット</Description>
      <Author>minami_SC</Author>
      <SnippetTypes>
        <SnippetType>Expansion</SnippetType>
      </SnippetTypes>
    </Header>
    <Snippet>
      <Declarations>
        <Literal>
          <ID>type</ID>
          <ToolTip>引数の型</ToolTip>
          <Default>string</Default>
        </Literal>
        <Literal>
          <ID>commandfield</ID>
          <ToolTip>コマンドのバッキング変数</ToolTip>
          <Default>myCommand</Default>
        </Literal>
        <Literal>
          <ID>commandname</ID>
          <ToolTip>コマンド名</ToolTip>
          <Default>MyCommand</Default>
        </Literal>
      </Declarations>
      <Code Language="csharp">
        <![CDATA[

private RelayCommand<$type$> $commandfield$Command;
public RelayCommand<$type$> $commandname$Command
{
    get { return $commandfield$Command = $commandfield$Command ?? new RelayCommand<$type$>($commandname$); }
}

private void $commandname$($type$ parameter)
{
}

$end$]]>
      </Code>
    </Snippet>
  </CodeSnippet>
  <CodeSnippet Format="1.0.0">
    <Header>
      <Title>BindableBase派生プロパティを定義します。</Title>
      <Shortcut>propbb</Shortcut>
      <Description>BindableBaseから派生したプロパティのコードスニペット</Description>
      <Author>minami_SC</Author>
      <SnippetTypes>
        <SnippetType>Expansion</SnippetType>
      </SnippetTypes>
    </Header>
    <Snippet>
      <Declarations>
        <Literal>
          <ID>type</ID>
          <ToolTip>プロパティ型</ToolTip>
          <Default>int</Default>
        </Literal>
        <Literal>
          <ID>fieldname</ID>
          <ToolTip>このプロパティのバッキング変数</ToolTip>
          <Default>myVar</Default>
        </Literal>
        <Literal>
          <ID>propertyname</ID>
          <ToolTip>プロパティ名</ToolTip>
          <Default>MyProperty</Default>
        </Literal>
      </Declarations>
      <Code Language="csharp">
        <![CDATA[

private $type$ $fieldname$;
public $type$ $propertyname$
{
    get { return $fieldname$; }
    set { this.SetProperty(ref this.$fieldname$, value); }
}

$end$]]>
      </Code>
    </Snippet>
  </CodeSnippet>
</CodeSnippets>

このファイルを↓のフォルダに保存すれば使えるようになります。
[Documentsのフォルダ]\Visual Studio 2013\Code Snippets\Visual C#\My Code Snippets