我在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但是我只能通过这种方式获得父窗口的句柄,我无法获得父窗口中包含的用户控件的句柄。
我该怎么做?
答案 0 :(得分:0)
您可以通过多种方式解决此问题:
在UserControl
中有一个自定义Dependency Property,即bool
类型。在Button
内点击UserControl
,将此bool DP设置为true。在父Window
中,使用`Trigger
检查此DP,并在True
使用BeginStoryboard
操作时启动Storyboard
。
重复上述相同的过程,但使用Tag
属性而不是自定义DP。 (尽量避免这种方法。只是不太好)
在RoutedEvent
中创建自定义UserControl
,然后点击Button.Click
中的活动。让父窗口订阅此事件并调用故事板。
如果您使用类似Messenger
/ EventAggregator
类的内容,只需从Button.Click
向父视图发送消息,并在父视图中调用故事板收到此消息。
在父视图中创建ICommand
属性,并使Button
中的UserControl
通过RelativeSource
绑定绑定到此命令,或者DataContext
{ {1}}是父窗口,您甚至不需要RelativeSource
来访问该命令。在Command OnExecute(...)
启动故事板。
<强>要点:强>
我敢打赌,还有很多我无法想到的选择,关键是当你的Button.Click
出现时,请告知家长你选择它需要改变的方式然而,它选择这样做的状态,并负责将该请求发送到父视图。
孩子在请求状态更改时停止,父视图是实际执行状态的视图。这样可以节省您对控制问题的所有访问权限,并且还有助于坚持“只有一件事情担心那件事和那件事情”的原则(“事物”是每个视图的类)