2014-11-20 5 views
1

Я хочу показать всплывающее окно с задержкой 2 секунды всегда, когда выбрана ячейка столбца и курсор остается дольше 2 секунд. Я мог бы реализовать это с помощью таймеров и обработчиков событий, но я думаю, что я также могу добиться этого с помощью раскадровки. Я пытаюсь сделать это так:Открыть всплывающее окно с задержкой при нажатии ячейки

<Window x:Class="Wpfpopupstoryboard.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="300" Width="300"> 

<Window.Resources> 
    <Storyboard x:Key="ShowPopup"> 
     <BooleanAnimationUsingKeyFrames Storyboard.TargetName="LockPopup" Storyboard.TargetProperty="(Popup.IsOpen)"> 
      <DiscreteBooleanKeyFrame KeyTime="00:00:02.0" Value="True" /> 
     </BooleanAnimationUsingKeyFrames> 
    </Storyboard> 

    <Storyboard x:Key="HidePopup" Storyboard.TargetName="LockPopup" Storyboard.TargetProperty="(Popup.IsOpen)"> 
     <BooleanAnimationUsingKeyFrames> 
      <DiscreteBooleanKeyFrame KeyTime="00:00:00.1" Value="False" /> 
     </BooleanAnimationUsingKeyFrames> 
    </Storyboard> 
</Window.Resources> 

<Grid x:Name="LayoutRoot"> 
    <DataGrid Name="MyGrid" xmlns:sys="clr-namespace:System;assembly=mscorlib" IsReadOnly="True"> 
     <DataGrid.Resources> 
      <Style TargetType="DataGridCell"> 
       <Setter Property="Template"> 
        <Setter.Value> 
         <ControlTemplate TargetType="DataGridCell"> 
          <StackPanel> 
           <Border x:Name="border" 
          BorderThickness="2" 
          BorderBrush="Silver"> 
            <ContentPresenter Name="MyContentPresenter" Content="{Binding}"/> 

           </Border> 
           <Popup x:Name="LockPopup" PlacementTarget="{Binding ElementName=MyContentPresenter}" Placement="Bottom" DataContext="{Binding}"> 
            <TextBlock Text="This is a popup" Background="White" Foreground="Black" /> 
           </Popup> 
          </StackPanel> 

          <ControlTemplate.Triggers> 
           <EventTrigger RoutedEvent="StackPanel.MouseLeftButtonDown"> 
            <BeginStoryboard Storyboard="{StaticResource ShowPopup}"/> 
           </EventTrigger> 
           <EventTrigger RoutedEvent="StackPanel.MouseLeave"> 
            <BeginStoryboard Storyboard="{StaticResource HidePopup}"/> 
           </EventTrigger> 
          </ControlTemplate.Triggers> 
         </ControlTemplate> 
        </Setter.Value> 
       </Setter> 
      </Style> 
     </DataGrid.Resources> 
     <DataGrid.Columns> 
      <DataGridTextColumn Binding="{Binding}" Header="column" /> 
     </DataGrid.Columns> 
     <sys:String>item 1</sys:String> 
     <sys:String>item 2</sys:String> 
     <sys:String>item 3</sys:String> 
     <sys:String>item 4</sys:String> 
    </DataGrid> 
</Grid> 

Что не так? Может кто-нибудь мне помочь?

Спасибо!

ответ

1

С помощью команды RemoveStoryboard вам нужно всего лишь 1 раскадровку (чтобы показать всплывающее окно). Кроме того, право события, чтобы вызвать раскадровку здесь Selected вместо StackPanel.MouseLeftButtonDown:

<ControlTemplate.Triggers> 
    <EventTrigger RoutedEvent="Selected"> 
     <BeginStoryboard Storyboard="{StaticResource ShowPopup}" Name="bg"/> 
    </EventTrigger> 
    <EventTrigger RoutedEvent="MouseEnter"> 
     <BeginStoryboard Storyboard="{StaticResource ShowPopup}" Name="bg2"/> 
    </EventTrigger> 
    <EventTrigger RoutedEvent="MouseLeave"> 
     <RemoveStoryboard BeginStoryboardName="bg"/> 
    </EventTrigger> 
</ControlTemplate.Triggers> 

Вы можете удалить HidePopup раскадровки, потому что нам не нужен его с указанным кодом.

Фактически вы также можете использовать StackPanel.PreviewMouseLeftButtonDown, так как StackPanel.MouseLeftButtonDown подавляется (при этом пузырьки от внутренних элементов). Однако это немного объясняет, почему он не работает в первую очередь. Использование события Selected - лучший выбор.

+1

Спасибо King King, он работает очень хорошо. – MrScf

1

MouseLeftButtonDown Событие имеет Direct Стратегия маршрутизации (см. UIElement.MouseLeftButtonDown Event (msdn)).

Так что это не будет пузыриться до вашего ContentTemplate.

Вам необходимо установить триггер события непосредственно на ваш StackPanel.

Смежные вопросы