UWP開発:コードのシンプル化と再利用のためのカスタムアクションの活用

10304 ワード

App開発者一人一人が、テキストのコピー、電話、メール、メール、アプリケーションへのコメントなど、開発過程でいくつかのコードを繰り返し使用していると信じています.プロジェクト間でこれらのコードセグメントをコピーするのは、本当に良い方法ではありません.そのため、これらのコードをUtilityクラスのようなもの、またはライブラリ(Class Library)に配置して呼び出します.本文も同じことを完成させてあげますが、本文はActionで完成します.この2つの方法の目的は同じであり,前者はコードセグメントのカプセル化を実現しているにもかかわらず,コード(通常はView Modelで)を書く必要があるが,後者はXAMLに数行のコードを追加すればよい.それに比べて、後者はもっと便利だ.
    ここでのActionはBehaviors SDKからの概念であり,実はIActionインタフェースを実現したクラスである.私は本文でBehaviors SDKに関する基本的な知識を紹介しません.もしあなたがそれについてまだ理解していないなら、園で関連文章を検索して勉強することができます(本文の最後の参考文章では、私はすでに良い文章を列挙しました).
    本質的に,ActionはBehaviorと同じ目的を持っており,いずれも再利用可能なコードである.実装されるIActionインタフェースでは、条件が満たされたときに実行されるExecuteメソッドが定義されています.条件は、コントロールのイベントがトリガーされたり、属性が変更されたりする可能性があります.Executeメソッドでは、目的のタスクを完了する方法を呼び出すことができます.
    前述の要件を満たすために、まずUWPプロジェクトを新規作成し、Behavior SDKリファレンスを追加します(このプロジェクトは主にテストの後に作成されたActionです).
    IActionインタフェースを実装したCommonTaskActionというクラスを新規作成し、DependencyObjectクラスから継承します.これにより、XAMLでBindingで値を割り当てることができる依存属性を定義できます.次のようになります.
public class CommonTaskAction : DependencyObject, IAction
{
        public object Execute(object sender, object parameter)
        {

} }

    次に、一般的なタスク・タイプを表す列挙を定義します.次のようにします.
    public enum CommonTaskType
    {
        /// <summary>
        ///     
        /// </summary>
        CopyText,
        /// <summary>
        ///    
        /// </summary>
        MakePhoneCall,
    }

    次に、CommonTaskActionクラスにいくつかの依存属性を追加します.TaskType(タスクタイプ)、TextToBeCopied(コピー対象テキスト)、PhoneNO(電話番号)、PhoneDisplayName(電話時の表示名)です.以下のようになります.
        public static readonly DependencyProperty PhoneDisplayNameProperty =
            DependencyProperty.Register("PhoneDisplayName", typeof(string), typeof(CommonTaskAction), new PropertyMetadata(string.Empty));

        
        public static readonly DependencyProperty PhoneNOProperty =
            DependencyProperty.Register("PhoneNO", typeof(string), typeof(CommonTaskAction), new PropertyMetadata(string.Empty));

        
        public static readonly DependencyProperty TaskTypeProperty =
            DependencyProperty.Register("TaskType", typeof(CommonTaskType), typeof(CommonTaskAction), new PropertyMetadata(0));

        
        public static readonly DependencyProperty TextToBeCopiedProperty =
            DependencyProperty.Register("TextToBeCopied", typeof(string), typeof(CommonTaskAction), new PropertyMetadata(string.Empty));

        public string PhoneDisplayName
        {
            get { return (string)GetValue(PhoneDisplayNameProperty); }
            set { SetValue(PhoneDisplayNameProperty, value); }
        }

        public string PhoneNO
        {
            get { return (string)GetValue(PhoneNOProperty); }
            set { SetValue(PhoneNOProperty, value); }
        }

        public CommonTaskType TaskType
        {
            get { return (CommonTaskType)GetValue(TaskTypeProperty); }
            set { SetValue(TaskTypeProperty, value); }
        }

        public string TextToBeCopied
        {
            get { return (string)GetValue(TextToBeCopiedProperty); }
            set { SetValue(TextToBeCopiedProperty, value); }
        }

    このとき,Executeメソッドで主な論理を完了し,次のコードを追加する.
        public object Execute(object sender, object parameter)
        {
            switch (TaskType)
            {
                case CommonTaskType.CopyText:
                    if (!string.IsNullOrWhiteSpace(TextToBeCopied))
                    {
                        //     
                        DataPackage dataPackage = new DataPackage
                        {
                            RequestedOperation = DataPackageOperation.Copy,
                        };
                        dataPackage.SetText(TextToBeCopied);
                        Clipboard.SetContent(dataPackage);
                    }
                    break;

                case CommonTaskType.MakePhoneCall:
                    if (!string.IsNullOrWhiteSpace(PhoneNO))
                    {
                        //    
                        Windows.ApplicationModel.Calls.PhoneCallManager.ShowPhoneCallUI(PhoneNO, PhoneDisplayName);
                    }
                    break;
            }

            return true;
        }

     これにより、カスタムアクションが完了し、テキストのコピー、電話のロジックのみが追加され、自分のニーズに応じて他のロジックを追加することができます.    次に、それをどのように使うかを見てみましょう.MainPage.xamlに次のコードを追加します.
<Page ...
      xmlns:Core="using:Microsoft.Xaml.Interactions.Core"
      xmlns:Interactivity="using:Microsoft.Xaml.Interactivity"
      xmlns:MyAction="using:CustomActionTest.Actions"

 
  <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <Grid Margin="12">
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto" />
                <RowDefinition Height="Auto" />
            </Grid.RowDefinitions>
            <TextBlock Style="{ThemeResource TitleTextBlockStyle}" Text="CommonTaskAction   " />
            <StackPanel Grid.Row="1" Orientation="Horizontal">
                <TextBox x:Name="txtName"
                         Width="400"
                         Text="       " />
                <Button Content="  ">
                    <Interactivity:Interaction.Behaviors>
                        <Core:EventTriggerBehavior EventName="Tapped">
                            <MyAction:CommonTaskAction TaskType="CopyText" TextToBeCopied="{Binding Text, ElementName=txtName}" />
                        </Core:EventTriggerBehavior>
                    </Interactivity:Interaction.Behaviors>
                </Button>
            </StackPanel>

            <!--       MakePhoneCall         ,     ,    :  -->
            <!--<MyAction:CommonTaskAction TaskType="MakePhoneCall" PhoneNO="13800XXXXXX" PhoneDisplayName="     " />-->
        </Grid>
    </Grid>

    その中の TaskType,値表現コピーテキスト, TextToBeCopiedは、バインドによってテキストボックスの値を取得します.したがって、このアクションは指定されたタスクを完了することができます.
    本文の考え方を理解して、今、あなたはそれをあなたに適したCommonTaskActionに改造することができます.
    もっと良いアドバイスや意見があれば、メッセージを残してお互いに交流してください.
ソースのダウンロード
 
参考記事:
Windows汎用アプリケーション開発手記-Behavior SDK概要
Behaviors SDK