WPF用户控件针对父窗口对象运行故事板

时间:2013-07-24 13:05:34

标签: wpf animation storyboard

我在WPF的父窗口中包含UserControl。 usercontrol包含一个按钮,按下该按钮时,需要回调父窗口并启动故事板动画以将UserControl的不透明度设置为0,同时将不同UserControl的不透明度设置为1。

因此,我的usercontrol中有一个按钮隐藏了包含的usercontrol并切换到另一个可见的按钮。

如果按钮位于主窗口中,则很容易,因为第一个用户控件有一个x:左侧面板的名称,第二个用户名称为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”usercontrol对象。我已经尝试过RelativeSource但是我只能通过这种方式获得父窗口的句柄,我无法获得父窗口中包含的用户控件的句柄。

我该怎么做?

1 个答案:

答案 0 :(得分:0)

您可以通过多种方式解决此问题:

  1. UserControl中有一个自定义Dependency Property,即bool类型。在Button内点击UserControl,将此bool DP设置为true。在父Window中,使用`Trigger检查此DP,并在True使用BeginStoryboard操作时启动Storyboard

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

  3. RoutedEvent中创建自定义UserControl,然后点击Button.Click中的活动。让父窗口订阅此事件并调用故事板。

  4. 如果您使用类似Messenger / EventAggregator类的内容,只需从Button.Click向父视图发送消息,并在父视图中调用故事板收到此消息。

  5. 在父视图中创建ICommand属性,并使Button中的UserControl通过RelativeSource绑定绑定到此命令,或者DataContext { {1}}是父窗口,您甚至不需要RelativeSource来访问该命令。在Command OnExecute(...)启动故事板。

  6. <强>要点:

    我敢打赌,还有很多我无法想到的选择,关键是当你的Button.Click出现时,请告知家长你选择需要改变的方式然而,它选择这样做的状态,并负责将该请求发送到父视图。

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