2

我在 WPF 的父窗口中包含一个 UserControl。用户控件包含一个按钮,当按下该按钮时,需要回调父窗口并启动情节提要动画以将用户控件的不透明度设置为 0,同时将其他用户控件的不透明度设置为 1。

所以有效地在我的用户控件中有一个按钮,它隐藏了包含的用户控件并切换到另一个可见的按钮。

如果按钮在主窗口中,则很容易,因为第一个用户控件的 x:Name 为 leftpanel,第二个称为 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中有一个自定义的依赖属性。在您单击此 bool DP 时,将其设置为 true。在 parent中,使用 a来检查这个 DP,并在使用action 时启动.UserControlboolButtonUserControlWindow`TriggerTrueBeginStoryboardStoryboard

  2. 重复与上述相同的过程,但使用Tag属性而不是自定义 DP。(尽量避免这种方法。只是不太好)

  3. RoutedEvent在您的中创建一个自定义UserControl并从Button.Click. 让父窗口订阅此事件并调用情节提要。

  4. 如果您使用Messenger/EventAggregator类之类的东西,只需从 向父视图发送一条消息,Button.Click并在收到此消息时从父视图调用情节提要。

  5. ICommand在您的父视图中创建一个属性,并Button通过绑定将您UserControl绑定到此命令,RelativeSource或者如果它DataContext是父窗口,您甚至不需要RelativeSource访问该命令。在 Command 中OnExecute(...)启动 Storyboard。

概括:

我敢打赌,还有很多我无法快速想到的选项,关键是当您Button.Click以您选择的方式通知父母时,需要改变其孩子的状态,但它选择这样做并承担责任对父视图执行该请求。

子视图在请求状态更改时停止,父视图是实际执行它的视图。这为您节省了对控制问题的所有访问权限,并且还有助于坚持“让一件事担心那件事并且只担心那件事”的原则(“事物”是每个视图的类)

于 2013-07-25T12:45:43.537 回答