ごった煮

色々な事を書いてます

UWPのBehaviorを使う

UWP用のBehaviorライブラリが出てきたみたいなのでちょっと使ってみようかと思います。

今までのBehaviorは、Blendのライブラリを参照に追加したりといった方法で使っていましたが、UWP版は、NuGetから入れられます。

ちなみにソースは、GitHubで管理されているのでバグフィックス等したらぜひプルリクを投げましょう。

リポジトリは、ここです。

 

ライブラリをインストールする

 

Behaviorのライブラリは、

の二種類があり、Nativeは、C++プロジェクト用、Managedは、C#プロジェクト用になります。(VB.NETでも使えるかは不明)

両方同時にインストールすると普通にビルド通らないので気を付けましょう。

また、今までのBehavior SDKも同時に参照できますが、それをインポートした状態でも普通にビルド通らないっぽいので気を付けましょう。

 

ライブラリを使う

ライブラリを使う場合は、例のごとく

xmlns:Interactivity="using:Microsoft.Xaml.Interactivity"
xmlns:Interactions="using:Microsoft.Xaml.Interactions.Core"

XAMLに記述すればOKです。

 

超シンプルなビヘイビア

基本的にWPFWindowsストアアプリと同じような感じで使えます。

        <Button x:Name="TriggerButton" Content="Button" Background="White">
                    <Interactivity:Interaction.Behaviors>
                        <behavior:ColorSwitchBehavior />
                    </Interactivity:Interaction.Behaviors>
                </Button>

XAMLにこんな感じでbehaviorを記述して

/// 
        /// イベントのアタッチを行う
        /// 
        protected override void OnAttached()
        {
            base.OnAttached();
            this.AssociatedObject.Click += AssociatedObject_KeyDown;
        }

        /// 
        /// ボタンの背景色を切り替える
        /// 
        /// 
        /// 
        private void AssociatedObject_KeyDown(object sender, object e)
        {
            var brush = this.AssociatedObject.Background as SolidColorBrush;
            switch (brush.Color.ToString())
            {
                case "#FFFF0000":
                    this.AssociatedObject.Background = new  SolidColorBrush(Colors.Gray);
                    break;
                default:
                    this.AssociatedObject.Background = new SolidColorBrush(Colors.Red);
                    break;
            }
        }

        /// 
        /// イベントのデタッチを行う
        /// 
        protected override void OnDetaching()
        {
            base.OnDetaching();
            this.AssociatedObject.Click -= AssociatedObject_KeyDown;
        }

 

みたいに書くとこのコードでは、ボタンの背景色を切り替える処理が実行されます。

普通にusingする名前空間だけ変えれば大体今までのコードを流用できるかと思います。

 

これだとただコードビハインドを分離しただけなので、別にViewに書けばいいじゃん()みたいになりかねないのでバインディングもしてみます。

 

バインディングでもっと楽をする

Bindingを使って最小限のコーディングでページ遷移してみます。

                   <Button x:Name="NavigateButton" Content="Navigate" Background="White">
                        <Interactivity:Interaction.Behaviors>
                            <Core:EventTriggerBehavior EventName="Click" SourceObject="{Binding ElementName=NavigateButton}" >
                                <Core:NavigateToPageAction TargetPage="{Binding Path=PageName}" />
                            </Core:EventTriggerBehavior>
                        </Interactivity:Interaction.Behaviors>
                    </Button>

 

このコードでは、ViewModelにPageNameというページ名を持つプロパティを保持してそのページに対してページ遷移するという動作をします。

そのため、PageNameを指定するコードだけをC#で記述してあとは、すべてXAMLで完結するコードです。

 

まとめ

UWP用のBehaviorやPrismが出てきたのでだいぶUWPの開発が捗りそうですね。

基本的には、既存のコードの流用が可能なはずなので今まで使ってきた人たちは、問題なく使えるはずです。

肥大化しがちなViewを軽量化して分離しやすくなるのは、非常にありがたいです。

 

Behaviorやらを全く使わないでコードビハインド一辺倒な大規模なプロジェクトはかなり保守性が低くて死にたくなるのでいろんな人のためにもぜひ活用しましょう。