Wpf 如何在toolkit DropDownButton IsOpen上设置事件触发器
我有一个下拉按钮(来自扩展WPF工具包的组件),它有一个列表视图作为下拉内容。我想在用户选择一个项目后立即关闭弹出部分。我想我可以通过一个事件触发器来实现这一点,将ListView.SelectionChanged作为源事件,将DropDownButton.IsOpen作为目标属性,并将其设置为false 但是,当我选择一个项目时,会出现以下异常: 无法解析属性路径“IsOpen”中的所有属性引用。验证适用对象是否支持这些属性 这是我的XAML:Wpf 如何在toolkit DropDownButton IsOpen上设置事件触发器,wpf,xaml,events,triggers,Wpf,Xaml,Events,Triggers,我有一个下拉按钮(来自扩展WPF工具包的组件),它有一个列表视图作为下拉内容。我想在用户选择一个项目后立即关闭弹出部分。我想我可以通过一个事件触发器来实现这一点,将ListView.SelectionChanged作为源事件,将DropDownButton.IsOpen作为目标属性,并将其设置为false 但是,当我选择一个项目时,会出现以下异常: 无法解析属性路径“IsOpen”中的所有属性引用。验证适用对象是否支持这些属性 这是我的XAML: <ListView.Triggers>
<ListView.Triggers>
<EventTrigger RoutedEvent="ListView.SelectionChanged" SourceName="MyListView">
<EventTrigger.Actions>
<BeginStoryboard>
<Storyboard>
<BooleanAnimationUsingKeyFrames
Storyboard.Target="{Binding Source={RelativeSource Mode=FindAncestor,AncestorType=xctk:DropDownButton}}"
Storyboard.TargetProperty="IsOpen"
FillBehavior="HoldEnd">
<DiscreteBooleanKeyFrame Value="False" KeyTime="0:0:1" />
</BooleanAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
</ListView.Triggers>
有人能告诉我我做错了什么吗?对于那些感兴趣的人,这里有一个相对简单的解决方案,不涉及任何代码隐藏
<Window x:Class="PopupDemo.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<Style x:Key="MyPopupMenu" TargetType="MenuItem" >
<Setter Property="HorizontalAlignment" Value="Center" />
<Setter Property="SnapsToDevicePixels" Value="True" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="MenuItem">
<Border x:Name="Border"
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}">
<Grid >
<ContentPresenter ContentSource="Header" />
<Rectangle x:Name="overlay"
Fill="Black"
IsHitTestVisible="False"
Visibility="Hidden"
Opacity="0.1" >
</Rectangle>
<Popup IsOpen="{Binding Path=IsSubmenuOpen, RelativeSource={RelativeSource TemplatedParent}}" Placement="Bottom" x:Name="SubMenuPopup" Focusable="false" PopupAnimation="{DynamicResource {x:Static SystemParameters.MenuPopupAnimationKey}}">
<Border x:Name="SubMenuBorder"
Background="White"
BorderBrush="{Binding Path=Foreground, RelativeSource={RelativeSource AncestorType={x:Type Menu}}}"
BorderThickness="1" Padding="2,2,2,2">
<Grid x:Name="SubMenu" Grid.IsSharedSizeScope="True">
<!-- StackPanel holds children of the menu. This is set by IsItemsHost=True -->
<StackPanel IsItemsHost="True" KeyboardNavigation.DirectionalNavigation="Cycle"/>
</Grid>
</Border>
</Popup>
</Grid>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True" >
<Setter TargetName="overlay" Property="Visibility" Value="Visible" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
<DockPanel LastChildFill="False">
<Menu DockPanel.Dock="Top" Background="Transparent">
<MenuItem Style="{StaticResource MyPopupMenu}" >
<MenuItem.Header>
<Border Background="#3382cc" BorderThickness="12 4" BorderBrush="#3382cc">
<StackPanel Orientation="Horizontal">
<TextBlock Text="My Popup Menu" Foreground="White" />
</StackPanel>
</Border>
</MenuItem.Header>
<MenuItem Header="Alfa" />
<MenuItem Header="Bravo" />
<MenuItem Header="Charlie" />
<MenuItem Header="Delta" />
<MenuItem Header="Echo" />
</MenuItem>
</Menu>
</DockPanel>
</Window>
我认为在动画(情节串连板或其他类型的动画,如使用关键帧的BooleanAnimation)中使用RelativeSource
或ElementName
无法绑定任何东西。您必须尝试某种代理或使用{x:Reference}
(从.NET 4.0开始支持)来指定情节提要.Target
,这意味着您的下拉按钮应该指定一些名称。@King-King:使用x:Reference确实消除了异常,虽然在弹出窗口消失之前有一个小的延迟。但是现在,再次单击下拉按钮重新打开弹出部分不再工作。我正在尝试做同样的事情,你有没有让它工作过?还是你在玩自己的控制游戏?@BitFiddler已经有一段时间了,但如果我没记错的话,我玩了自己的控制游戏。我已经在WPF论坛上发布了帖子,所以你可能想看看那里的讨论:@bitfidler查看我关于纯XAML解决方案的其他答案。