WPFで起動時にメソッドを呼び出す

アプリケーション起動時に、初期化処理等のメソッドを呼び出す方法を記載します。
基本的にコードビハインドには記述しないことを目指しています。

準備

起動時にメソッドを呼び出す際に「Behavior」というライブラリを使用します。

Behaviorとは
Blend SDK for WPFに同梱されているライブラリ。
BlendはVisual Studioに同梱されている。
BehaviorはTrigger、Action、Behaviorを提供している。

「Behavior」については、どこかのタイミングで詳しく調べたいと思います。

「Behavior」を使う場合、以下のサイトからSDKをダウンロードします。(かずきさんのブログが詳しい)

https://www.microsoft.com/en-us/download/details.aspx?id=10801

元々、SDKをダウンロードしなくても使えてたのだが、どうしてだろう。。。

C:\Program Files (x86)\Microsoft SDKs\Expression\Blend.NETFramework\v4.0\Librariesに、Microsoft.Expression.Interactions.dllとSystem.Windows.Interactivity.dllがありますので、これをプロジェクトから参照します。

内容

起動時に処理したい内容を記述します。

// usingは省略
public class Initialize
    {
        public void InitRun()
        {
            // 何か処理
        }

    }

xamlファイルを以下のように記述すれば完了です。

<Window x:Class="StartupMethod.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:StartupMethod"
        xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
        xmlns:viewModel="clr-namespace:StartupMethod"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">

    <Window.DataContext>
        <viewModel:Initialize/>
    </Window.DataContext>

    <Window.Resources>
        <ObjectDataProvider ObjectType="{x:Type viewModel:Initialize}"
                      MethodName="InitRun" x:Key="init">
        </ObjectDataProvider>
    </Window.Resources>

    <i:Interaction.Triggers>
        <i:EventTrigger EventName="Loaded">
            <i:InvokeCommandAction Command="{Binding Source={StaticResource init}}" />
        </i:EventTrigger>
    </i:Interaction.Triggers>

    <Grid>

    </Grid>
</Window>

詳細

ObjectDataProviderという箇所に今回使いたいメソッドを設定します。
ObjectTypeはインスタンスを作成するオブジェクトの型、MethodNameはメソッドの名前を設定しています。
EventTriggerでLoaded(要素のレイアウトやレンダリングが完了し、操作を受け入れる準備が整ったとき)のイベントが発生するとInitRun()が実行されるようになります。

この記事をまとめているときに、イベントハンドラでメソッドを呼び出したほうがいいかもしれないということが書かれていたのでイベントハンドラについてもいずれ調べたいと思います。

参考

https://blog.okazuki.jp/entry/2014/12/21/205558

https://anopara.net/2014/06/20/cool-behavior-life/

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA