我使用WPF开发了一个应用程序,没有使用特殊的MVVM框架。现在这个应用程序越来越大,因此我想切换到Caliburn.Micro,但是这会导致一些问题。
我的视图包含ItemsControl中的ListBoxes。在ListBoxItems中放置了一个按钮,当用户悬停在父ListBox上时,按钮必须改变不透明度,再次悬停在按钮本身上时也是如此(当鼠标再次离开这些控件时,情况相反)。为了实现这一点,我想出了以下xaml代码:
我的视图包含ItemsControl中的ListBoxes。在ListBoxItems中放置了一个按钮,当用户悬停在父ListBox上时,按钮必须改变不透明度,再次悬停在按钮本身上时也是如此(当鼠标再次离开这些控件时,情况相反)。为了实现这一点,我想出了以下xaml代码:
<Style x:Key="DeleteButtonStyle" TargetType="Button">
<Setter Property="Opacity" Value="0.0" />
<Style.Triggers>
<EventTrigger RoutedEvent="Control.MouseEnter">
<RemoveStoryboard BeginStoryboardName="PartiallyFadeOutStoryboard" />
<RemoveStoryboard BeginStoryboardName="FadeOutStoryboard" />
<BeginStoryboard Storyboard="{StaticResource FadeInStoryboard}" x:Name="FadeInStoryboard"/>
</EventTrigger>
<EventTrigger RoutedEvent="Control.MouseLeave">
<RemoveStoryboard BeginStoryboardName="PartiallyFadeInStoryboard" />
<RemoveStoryboard BeginStoryboardName="FadeInStoryboard" />
<BeginStoryboard Storyboard="{StaticResource PartiallyFadeOutStoryboard}" x:Name="PartiallyFadeOutStoryboard"/>
</EventTrigger>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=IsMouseOver, NotifyOnSourceUpdated=True}" Value="True">
<DataTrigger.EnterActions>
<RemoveStoryboard BeginStoryboardName="PartiallyFadeOutStoryboard" />
<RemoveStoryboard BeginStoryboardName="FadeOutStoryboard" />
<BeginStoryboard Storyboard="{StaticResource PartiallyFadeInStoryboard}" x:Name="PartiallyFadeInStoryboard"/>
</DataTrigger.EnterActions>
<DataTrigger.ExitActions>
<RemoveStoryboard BeginStoryboardName="PartiallyFadeInStoryboard" />
<RemoveStoryboard BeginStoryboardName="FadeInStoryboard" />
<RemoveStoryboard BeginStoryboardName="PartiallyFadeOutStoryboard" />
<BeginStoryboard Storyboard="{StaticResource FadeOutStoryboard}" x:Name="FadeOutStoryboard"/>
</DataTrigger.ExitActions>
</DataTrigger>
</Style.Triggers>
</Style>
可惜的是,我转换到Caliburn之后,这个功能不再起作用了,因为最后一个的代码不再被执行。我认为这种行为的原因是我之前在ItemsControl中使用DataTemplate来定义视图;但现在我创建了一个额外的.xaml文件/类专门用于这些绑定到ItemsControl(包含ListBox)的项的视图 - 因此,RelativeSource TemplatedParent可能不再起作用。这个想法正确吗?我该如何以最优雅的方式解决这个问题?