2012-01-09 5 views
2

Я установил простой элемент управления с тремя прямоугольниками, каждый из которых имеет всплывающее окно, прикрепленное к нему. Первоначально все три всплывающих окна должны открываться (IsOpen = True), и все три имеют флаг StaysOpen, установленный на false. XAML для этого размещен ниже.Popup with StaysOpen = False

Из документации MSDN на StaysOpen я понимаю, что когда она ложна, щелчок мыши за пределами всплывающего окна закрывает всплывающее окно. Я нахожу, что если я нажимаю мышь полностью вне приложения, то все три всплывающие окна закрываются правильно. Однако, если я щелкнув внутри самого окна WPF, то закрывается только верхнее всплывающее окно. Остальные два остаются видимыми.

Кто-нибудь знает, что здесь происходит, и что я могу сделать, чтобы все три всплывающих окна закрылись, как ожидалось?

<Window x:Class="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> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="*"/> 
      <RowDefinition Height="30"/> 
      <RowDefinition Height="*"/> 
      <RowDefinition Height="30"/> 
      <RowDefinition Height="*"/> 
     </Grid.RowDefinitions> 
     <Rectangle x:Name="Rect1" Fill="DarkBlue"/> 
     <Rectangle x:Name="Rect2" Fill="Orange" Grid.Row="2"/> 
     <Rectangle x:Name="Rect3" Fill="DarkRed" Grid.Row="4"/> 
     <Popup PlacementTarget="{Binding ElementName=Rect1}" Placement="Right" IsOpen="True" StaysOpen="False"> 
      <Border BorderBrush="Black" BorderThickness="2" Background="Wheat" Width="200" Height="100"> 
       <TextBlock>Popup 1</TextBlock> 
      </Border> 
     </Popup> 
     <Popup PlacementTarget="{Binding ElementName=Rect2}" Placement="Right" IsOpen="True" StaysOpen="False"> 
      <Border BorderBrush="Black" BorderThickness="2" Background="Wheat" Width="200" Height="100"> 
       <TextBlock>Popup 2</TextBlock> 
      </Border> 
     </Popup> 
     <Popup PlacementTarget="{Binding ElementName=Rect3}" Placement="Right" IsOpen="True" StaysOpen="False"> 
      <Border BorderBrush="Black" BorderThickness="2" Background="Wheat" Width="200" Height="100"> 
       <TextBlock>Popup 3</TextBlock> 
      </Border> 
     </Popup> 
    </Grid> 
</Window> 

ответ

2

MSDN от говорит: «Когда StaysOpen ложно, управление Popup перехватывает все события мыши и клавиатуры, чтобы определить, когда один из этих событий происходит вне контроля Popup.»

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

+0

Я согласен с Клеменсом. Но вместо того, чтобы иметь несколько всплывающих окон, вы можете использовать adorners. Они дают вам большую гибкость (но также сложнее обрабатывать) http://msdn.microsoft.com/en-us/library/ms743737.aspx – SvenG

+0

Спасибо за ответ, Клеменс. Жаль, что это не сработает. Теперь я экспериментирую с использованием всплывающих окон, но сам обрабатываю события кликов. Не очень приятно на самом деле ... –

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