WPF で混合動作を使用してスタイルを拡張する
WPF では、通常、動作を定義することでコントロールに機能を追加します。ただし、インライン XAML を使用して同じ動作を複数のインスタンスに適用することは、添付プロパティへのアクセスの制限により難しい場合があります。この問題は、カスタム添付プロパティと拡張動作コレクション クラスを組み合わせて使用することで解決できます。
主な障害は、動作およびトリガーの添付プロパティにアクセス可能なセッター、および基本動作クラスの内部コンストラクターが不足していることです。これらの問題を解決するために、私たちは独自の動作とトリガーのコレクション クラスを導入しました。
さらに、既存の動作やトリガーを置き換えるのではなく、動作やトリガーが追加的であることを保証するために、カスタム添付プロパティを利用してメインの動作やトリガーのプロパティと対話します。 x:Shared
属性は、スタイル ターゲット リソースが参照されるたびに新しいコピーが作成されることを保証し、複数の要素が競合することなく動作の恩恵を受けることができるようにします。
実装例
次の例は、スタイルを通じて動作を拡張するアプリケーションを示しています。
<code class="language-xml"><Grid> <Grid.Resources> <String x:Key="stringResource1">stringResource1</String> <local:Triggers x:Key="debugTriggers" x:Shared="False"> <local:EventTrigger EventName="MouseLeftButtonDown"> <local:DebugAction Message="DataContext: {0}" MessageParameter="{Binding}" /> <local:DebugAction Message="ElementName: {0}" MessageParameter="{Binding Text, ElementName=textBlock2}" /> <local:DebugAction Message="Mentor: {0}" MessageParameter="{Binding Text, RelativeSource={RelativeSource AncestorType={x:Type FrameworkElement}}}" /> </local:EventTrigger> </local:Triggers> <Style x:Key="debugBehavior" TargetType="{x:Type TextBlock}"> <Setter Property="local:SupplementaryInteraction.Triggers" Value="{StaticResource debugTriggers}" /> </Style> </Grid.Resources> <StackPanel DataContext="{StaticResource stringResource1}"> <TextBlock Name="textBlock1" Style="{StaticResource debugBehavior}" Text="textBlock1" /> <TextBlock Name="textBlock2" Style="{StaticResource debugBehavior}" Text="textBlock2" /> <TextBlock Name="textBlock3" Style="{StaticResource debugBehavior}" Text="textBlock3" /> </StackPanel> </Grid></code>
この例では、トリガーを介した動作を利用することによるアクション内のデータ バインディングなどのさまざまなシナリオを示します。
カスタム動作とコレクション
拡張動作実装の一部、DebugAction
動作:
<code class="language-csharp">public class DebugAction : TriggerAction<DependencyObject> { public string Message { get; set; } public object MessageParameter { get; set; } protected override void Invoke(object parameter) { Debug.WriteLine(Message, MessageParameter, AssociatedObject, parameter); } }</code>
動作コレクション クラス:
<code class="language-csharp">public class Behaviors : List<Behavior> { } public class Triggers : List<TriggerBase> { }</code>
カスタマイズされた追加属性
メインの動作とトリガーのプロパティを操作するための追加のプロパティ:
<code class="language-csharp">public static class SupplementaryInteraction { public static void SetBehaviors(DependencyObject obj, Behaviors value) { obj.SetValue(BehaviorsProperty, value); } public static void SetTriggers(DependencyObject obj, Triggers value) { obj.SetValue(TriggersProperty, value); } public static readonly DependencyProperty BehaviorsProperty = DependencyProperty.RegisterAttached("Behaviors", ...); public static readonly DependencyProperty TriggersProperty = DependencyProperty.RegisterAttached("Triggers", ...); }</code>
このアプローチを採用することで、開発者はスタイルを通じて複雑な動作を複数の要素にシームレスに適用できるため、WPF アプリケーションの柔軟性と保守性が向上します。
以上がスタイルとカスタム添付プロパティを使用して、同じ WPF 動作を複数のコントロールに効率的に適用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。