n秒后关闭组合框

时间:2010-09-23 21:37:26

标签: wpf combobox popup eventtrigger

如果用户没有做出选择,我有一个保持打开状态的组合框。我想在2秒后用触发器关闭组合框。这是我的组合框样式的一部分,包括我失败的eventtrigger尝试完成此任务:

 <Style x:Key="ComboBoxStyle" TargetType="{x:Type ComboBox}">
   <Setter Property="FontFamily" Value="Bryant"/>
   <Setter Property="FontSize" Value="18px"/>
   <Setter Property="FontWeight" Value="Bold"/>
   <Setter Property="FocusVisualStyle" Value="{StaticResource ComboBoxFocusVisual}"/>
   <Setter Property="Foreground" Value="#FF000000"/>
   <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto"/>
   <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto"/>
   <Setter Property="Padding" Value="4,3"/>
   <Setter Property="Margin" Value="5"/>
   <Setter Property="Template">
    <Setter.Value>
     <ControlTemplate TargetType="{x:Type ComboBox}">
      <Grid x:Name="MainGrid" SnapsToDevicePixels="true">
       <Grid.ColumnDefinitions>
        <ColumnDefinition Width="0*"/>
        <ColumnDefinition/>
        <ColumnDefinition MinWidth="{DynamicResource {x:Static SystemParameters.VerticalScrollBarWidthKey}}" Width="0"/>
       </Grid.ColumnDefinitions>
       <Popup Margin="1" x:Name="PART_Popup" AllowsTransparency="true" StaysOpen="False" IsOpen="{Binding IsDropDownOpen, RelativeSource={RelativeSource TemplatedParent}}" Placement="Bottom" PopupAnimation="{DynamicResource {x:Static SystemParameters.ComboBoxPopupAnimationKey}}" Grid.ColumnSpan="2" Grid.Column="1">
         <Border x:Name="DropDownBorder" Background="{DynamicResource GrayBG}" MaxHeight="{TemplateBinding MaxDropDownHeight}" MinWidth="{Binding ActualWidth, ElementName=MainGrid}" BorderBrush="{StaticResource GrayBGBorder}" BorderThickness="2,0,2,2" CornerRadius="0,0,4,4" Width="{Binding ActualWidth, ElementName=DropWidth}">
         <ScrollViewer CanContentScroll="true" Template="{DynamicResource NeeboScrollViewer}">
          <ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" KeyboardNavigation.DirectionalNavigation="Contained"/>
         </ScrollViewer>
        </Border>
       </Popup>
       <ToggleButton x:Name="DropWidth" Style="{StaticResource ComboBoxReadonlyToggleButton}" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" Grid.ColumnSpan="2" IsChecked="{Binding IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}" Grid.Column="1"/>
       <ContentPresenter HorizontalAlignment="Left" Margin="35,0,0,0" VerticalAlignment="Center" IsHitTestVisible="false" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" Content="{TemplateBinding SelectionBoxItem}" ContentTemplate="{TemplateBinding SelectionBoxItemTemplate}" ContentTemplateSelector="{TemplateBinding ItemTemplateSelector}" Grid.Column="1"/>
      </Grid>
      <ControlTemplate.Triggers>
       <Trigger Property="HasItems" Value="false">
        <Setter Property="Height" TargetName="DropDownBorder" Value="95"/>
       </Trigger>
       <Trigger Property="IsEnabled" Value="false">
        <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
        <Setter Property="Background" Value="#FFF4F4F4"/>
       </Trigger>
       <Trigger Property="IsGrouping" Value="true">
        <Setter Property="ScrollViewer.CanContentScroll" Value="false"/>
       </Trigger>
                            <EventTrigger RoutedEvent="(Popup.Opened)"  SourceName="PART_Popup" >
                                <BeginStoryboard>
                                    <Storyboard>
                                        <BooleanAnimationUsingKeyFrames Storyboard.TargetName="PART_Popup" Storyboard.TargetProperty="(Popup.IsOpen)">
                                            <DiscreteBooleanKeyFrame KeyTime="00:00:03"  Value="False"/>
                                        </BooleanAnimationUsingKeyFrames>
                                    </Storyboard>
                                </BeginStoryboard>
                            </EventTrigger>
                        </ControlTemplate.Triggers>
     </ControlTemplate>
    </Setter.Value>
   </Setter>
  </Style>

有关如何完成此任务的任何建议?

1 个答案:

答案 0 :(得分:1)

如果没有实现附加行为,我会想不到这样做的方式会订阅已打开的事件,如果没有关闭,请等待2秒钟关闭它。

如果你不知道什么是附加行为,只需谷歌吧。

在实施之后,您可以将其设置为默认行为。