2013-09-11 1 views
0

У меня есть следующий XAML для отображения всплывающего окна мыши, введите событие текстового поля и закройте всплывающее окно мыши, оставляя событие текстового поля. Поэтому, когда я пытаюсь перейти к всплывающему окну, вызывается событие мыши, и всплывающее окно закрывается. Так что я хочу, чтобы всплывающее окно не закрывалось, если у меня есть фокус на всплывающее окно, а всплывающее окно должно быть закрыто, если я нажал на всплывающее окно или мышь не переполнена.Как открыть всплывающее окно до тех пор, пока оно не сфокусируется на wpf

Примечание. Но всплывающее окно должно быть закрыто при уходе с мыши, если у меня нет фокуса всплывающего окна.

<Window x:Class="WpfApplication4.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"> 
    <Grid> 
     <Control VerticalAlignment="Top"> 
      <Control.Template> 
       <ControlTemplate> 
        <StackPanel> 
         <TextBox x:Name="MyText"></TextBox> 
         <Popup x:Name="Popup" PopupAnimation="Fade" VerticalAlignment="Top"> 
          <Border Background="Red"> 
           <TextBlock>Test Popup Content</TextBlock> 
          </Border> 
         </Popup> 
        </StackPanel> 
        <ControlTemplate.Triggers> 
         <EventTrigger RoutedEvent="UIElement.MouseEnter" SourceName="MyText"> 
          <BeginStoryboard> 
           <Storyboard> 
            <BooleanAnimationUsingKeyFrames Storyboard.TargetName="Popup" Storyboard.TargetProperty="(Popup.IsOpen)"> 
             <DiscreteBooleanKeyFrame KeyTime="00:00:00" Value="True"/> 
            </BooleanAnimationUsingKeyFrames> 
           </Storyboard> 
          </BeginStoryboard> 
         </EventTrigger> 
         <EventTrigger RoutedEvent="UIElement.MouseLeave" SourceName="MyText"> 
          <BeginStoryboard> 
           <Storyboard> 
            <BooleanAnimationUsingKeyFrames Storyboard.TargetName="Popup" Storyboard.TargetProperty="(Popup.IsOpen)"> 
             <DiscreteBooleanKeyFrame KeyTime="00:00:00" Value="False"/> 
            </BooleanAnimationUsingKeyFrames> 
           </Storyboard> 
          </BeginStoryboard> 
         </EventTrigger> 
        </ControlTemplate.Triggers> 
       </ControlTemplate> 
      </Control.Template> 
     </Control> 
    </Grid> 
</Window> 
+0

Пожалуйста, не используйте весь жирный текст. – Sheridan

ответ

0

Вы должны добавить MouseEnter и MouseLeave событие для всплывающего меню также же, как текстовое поле

    <EventTrigger RoutedEvent="UIElement.MouseEnter" SourceName="Popup"> 
         <BeginStoryboard> 
          <Storyboard> 
           <BooleanAnimationUsingKeyFrames Storyboard.TargetName="Popup" Storyboard.TargetProperty="(Popup.IsOpen)"> 
            <DiscreteBooleanKeyFrame KeyTime="00:00:00" Value="True"/> 
           </BooleanAnimationUsingKeyFrames> 
          </Storyboard> 
         </BeginStoryboard> 
        </EventTrigger> 

        <EventTrigger RoutedEvent="UIElement.MouseLeave" SourceName="Popup"> 
         <BeginStoryboard> 
          <Storyboard> 
           <BooleanAnimationUsingKeyFrames Storyboard.TargetName="Popup" Storyboard.TargetProperty="(Popup.IsOpen)"> 
            <DiscreteBooleanKeyFrame KeyTime="00:00:00" Value="False"/> 
           </BooleanAnimationUsingKeyFrames> 
          </Storyboard> 
         </BeginStoryboard> 
        </EventTrigger> 
0

таким образом, что я делаю это, чтобы привязать bool значение к Popup.IsOpen собственности. Вы все еще можете установить это верно в вашем MouseEnter обработчик, но вы можете выбрать, когда вы установите его на ложь:

<Popup IsOpen="{Binding IsPopupOpen}" StaysOpen="False" AllowsTransparency="True"> 
+0

спасибо за ваш ответ, но на самом деле я не хочу использовать свойство ViewModel, а хочу сделать все волшебство через сам XAML –