如何在工具包DropDownButton IsOpen上设置事件触发器

时间:2014-10-27 16:37:12

标签: wpf xaml events triggers

我有一个DropDownButton(来自Extended WPF Toolkit的组件),它有一个ListView作为下拉内容。我想在用户选择项目后立即关闭Popup部分。我认为我可以通过ListView.SelectionChanged作为源事件的事件触发器实现此目的,并将DropDownButton.IsOpen作为目标属性设置为false。

但是当我选择一个项目时,我得到以下异常:

  

无法解析属性路径中的所有属性引用' IsOpen'。验证适用的对象是否支持属性。

这是我的XAML:

<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>

有谁能告诉我我做错了什么?

1 个答案:

答案 0 :(得分:1)

对于那些感兴趣的人,这是一个相对简单的解决方案,不涉及任何代码隐藏。

<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>