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で値を割り当てることができる依存属性を定義できます.次のようになります.
次に、一般的なタスク・タイプを表す列挙を定義します.次のようにします.
次に、CommonTaskActionクラスにいくつかの依存属性を追加します.TaskType(タスクタイプ)、TextToBeCopied(コピー対象テキスト)、PhoneNO(電話番号)、PhoneDisplayName(電話時の表示名)です.以下のようになります.
このとき,Executeメソッドで主な論理を完了し,次のコードを追加する.
これにより、カスタムアクションが完了し、テキストのコピー、電話のロジックのみが追加され、自分のニーズに応じて他のロジックを追加することができます. 次に、それをどのように使うかを見てみましょう.MainPage.xamlに次のコードを追加します.
その中の TaskType,値表現コピーテキスト, TextToBeCopiedは、バインドによってテキストボックスの値を取得します.したがって、このアクションは指定されたタスクを完了することができます.
本文の考え方を理解して、今、あなたはそれをあなたに適したCommonTaskActionに改造することができます.
もっと良いアドバイスや意見があれば、メッセージを残してお互いに交流してください.
ソースのダウンロード
参考記事:
Windows汎用アプリケーション開発手記-Behavior SDK概要
Behaviors SDK
ここでの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