2

WPF の親ウィンドウ内に UserControl が含まれています。ユーザー コントロールには、別のユーザー コントロールの不透明度を 1 に設定しながら、ユーザー コントロールの不透明度を 0 に設定するために、押されたときに親ウィンドウにコールバックし、ストーリーボード アニメーションを開始する必要があるボタンが含まれています。

そのため、ユーザーコントロール内に、含まれているユーザーコントロールを非表示にし、表示されている別のユーザーコントロールに切り替えるボタンがあります。

ボタンがメイン ウィンドウにある場合、最初のユーザー コントロールには leftpanel の x:Name があり、2 番目のユーザー コントロールは leftpanelexpanded と呼ばれるので簡単です。

<DoubleAnimation Storyboard.TargetName="Leftpanel" Storyboard.TargetProperty="Opacity" Duration="0:0:0.2" To="0"/>
<DoubleAnimation Storyboard.TargetName="Leftpanelexpanded" Storyboard.TargetProperty="Opacity" Duration="0:0:0.2" To="1"/>

しかし、ユーザーコントロールのボタンでは、このアニメーションを「leftpanel」および「leftpanelexpanded」ユーザーコントロールオブジェクトをターゲットにする方法がわかりません。RelativeSource を試しましたが、この方法では親ウィンドウへのハンドルしか取得できず、親ウィンドウ内に含まれるユーザー コントロールへのハンドルを取得できません。

これどうやってするの?

4

1 に答える 1

0

これに対処する方法は複数あります。

  1. つまり、 typeのカスタムDependency Propertyがあります。内部をクリックすると、この bool DP が true に設定されます。親では、 を使用してこの DP をチェックし、アクションを使用してを開始します。UserControlboolButtonUserControlWindow`TriggerTrueBeginStoryboardStoryboard

  2. 上記と同じプロセスを繰り返しますTagが、カスタム DP の代わりにプロパティを使用します。(この方法は避けるようにしてください。あまり良くありません)

  3. でカスタムRoutedEventを作成し、UserControlからイベントを発生させますButton.Click。親ウィンドウにこのイベントをサブスクライブさせ、ストーリーボードを呼び出します。

  4. Messenger/EventAggregatorクラスのようなものを使用している場合は、から親ビューにメッセージを送信しButton.Click、このメッセージを受信したときに親ビューからストーリーボードを呼び出します。

  5. ICommand親ビューでプロパティを作成し、バインディングを介してこのコマンドButtonにバインドするか、それが親ウィンドウである場合は、コマンドにアクセスする必要さえありません。コマンドでストーリーボードを開始します。UserControlRelativeSourceDataContextRelativeSourceOnExecute(...)

概要:

私がすぐには思いつかないオプションがかなりあると思います。重要なのは、あなたが選択した方法で親に、子供の状態を変更する必要がButton.Clickあることを通知することですが、そうすることに決め、責任を与えることです親ビューに要求するアクションの。

子は状態の変更を要求した時点で停止し、実際にそれを行うのは親 View です。これにより、コントロールの問題へのすべてのアクセスが節約され、「そのことだけを心配する」という原則に忠実であり続けるのにも役立ちます(ここでの「もの」は各ビューのクラスです)

于 2013-07-25T12:45:43.537 に答える