gpt4 book ai didi

wpf - 带有RelativeSource TemplatedParent 的Caliburn.Micro DataTrigger

转载 作者:行者123 更新时间:2023-12-02 02:50:40 24 4
gpt4 key购买 nike

我使用 WPF 开发了一个应用程序,而没有使用特殊的 MVVM 框架。现在这个应用程序变得越来越大;因此,我想切换到 Caliburn.Micro,但这会导致一些问题。

我有一个在 ItemsControl 内包含 ListBoxes 的 View 。在 ListBoxItems 中放置了一个按钮,一旦用户将鼠标悬停在父 ListBox 上,以及当用户再次将鼠标悬停在 Button 上时,该按钮必须更改不透明度 本身(以及当鼠标再次离开这些控件时的方式)。为了实现这一点,我想出了这个 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 之后,不再工作,因为最后一个 DataTrigger 的代码不再执行。我认为这种行为的原因是我之前在 ItemsControl 中使用了 DataTemplate 来定义 View ;但现在我创建了一个额外的 .xaml 文件/类,只是为了查看绑定(bind)到 ItemsControl (其中包含 ListBox ) - 因此,RelativeSource TemplatedParent 可能不再工作。这个想法正确吗?我怎样才能以最优雅的方式解决这个问题?

最佳答案

尝试将 {RelativeSource}AncestorType 一起使用:

<DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=ListBoxItem}, Path=IsMouseOver}" 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>

将后者更改为您尝试绑定(bind)到的任何父元素的类型。

关于wpf - 带有RelativeSource TemplatedParent 的Caliburn.Micro DataTrigger,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46090558/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com