2013-05-01 1 views
6

Я пытаюсь создать выпадающий элемент управления, состоящий из элемента ToggleButton и Popup с TabControl внутри. Моя проблема заключается в том, что всплывающее окно не закрывается автоматически, если я не щелкнул по нему какой-то элемент управления.Всплывающее окно не теряет фокус и закрывается, пока я не щелкнул элемент управления внутри него

Рассмотрим пример ниже, где всплывающее окно содержит TabControl, который сам содержит элемент управления календарем внутри TabItem.

Ожидается, что всплывающее окно закрывается всякий раз, когда он теряет фокус (то есть, щелкнув окно контейнера), но для того, чтобы всплывающее окно запускало событие LostFocus и, таким образом, закрылось, я должен нажать одну из кнопок со стрелками на Календарный контроль.

<UserControl 
     x:Class="DropDownExample" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"> 
    <Grid> 
     <ToggleButton x:Name="ToggleButton" 
         ClickMode="Press">Example</ToggleButton> 
     <Popup x:Name="Popup" 
       Placement="Bottom" 
       AllowsTransparency="True" 
       StaysOpen="False" 
       PopupAnimation="Slide" 
       FocusManager.IsFocusScope="false"> 
      <TabControl x:Name="TabControl" 
         MinHeight="200"> 
       <TabItem> 
        <Calendar /> 
       </TabItem> 
      </TabControl> 
     </Popup> 
    </Grid> 
</UserControl> 

Открытие/закрытие всплывающего окна контролируется в зарегистрированном/непроверенных событий ToggleButton.

ответ

6

У меня нет никаких проблем закрытия всплывающего окна, когда я нажимаю в любом другом месте на экране, используя этот код:

<Window x:Class="AutomaticPopupClosing.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="100" Width="240"> 
    <Grid> 
     <Button Content="Show Popup" 
       VerticalAlignment="Center" 
       HorizontalAlignment="Center" 
       Click="ButtonBase_OnClick" /> 
     <Popup x:Name="Popup" 
       StaysOpen="False" 
       FocusManager.IsFocusScope="False" 
       PopupAnimation="Slide" 
       AllowsTransparency="True"> 
      <Border Padding="5" 
        Background="White" 
        FocusManager.IsFocusScope="False"> 
       <StackPanel> 
        <TabControl x:Name="TabControl" MinHeight="200"> 
         <TabItem> 
          <Calendar /> 
         </TabItem> 
        </TabControl> 
       </StackPanel> 
      </Border> 
     </Popup> 
    </Grid> 
</Window> 

В методе ButtonBase_OnClick я просто присвоить true к Popup.IsOpen собственности:

private void ButtonBase_OnClick(object sender, RoutedEventArgs e) 
{ 
    Popup.IsOpen = true; 
} 

У вас есть что-то еще, что стоит отметить? Я не мог восстановить вашу проблему.

Редактировать: прочитав ваши комментарии, я попытался переместить вышеуказанный код в пользовательский элемент управления. Код в основном такой же:

<UserControl x:Class="PopupDoesNotClose.PopupCalendar" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      mc:Ignorable="d" 
      d:DesignHeight="50" d:DesignWidth="100"> 
    <Grid> 
     <Button Content="Show Popup" 
       VerticalAlignment="Center" 
       HorizontalAlignment="Center" 
       Click="ButtonBase_OnClick" /> 
     <Popup x:Name="Popup" 
       StaysOpen="False" 
       FocusManager.IsFocusScope="False" 
       PopupAnimation="Slide" 
       AllowsTransparency="True"> 
      <Border Padding="5" 
        Background="White"> 
       <StackPanel> 
        <TabControl x:Name="TabControl" 
           MinHeight="200"> 
         <TabItem> 
          <Calendar /> 
         </TabItem> 
        </TabControl> 
       </StackPanel> 
      </Border> 
     </Popup> 
    </Grid> 
</UserControl> 

MainWindow теперь выглядит следующим образом:

<Window x:Class="PopupDoesNotClose.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:PopupDoesNotClose" 
     Title="MainWindow" 
     Height="100" 
     Width="240"> 
    <local:PopupCalendar /> 
</Window> 

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

+0

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

+0

Кроме того, заменяя календарь текстовым полем, мне нужно перемещать курсор (и фокус) внутри текстового поля до всплывающего окна. Закрывается по мере необходимости. –

+0

Я обновил свой ответ, но до сих пор не могу восстановить вашу проблему. – feO2x

8

Проблема заключается в том, что ClickMode = Press. Установка ClickMode = Release устраняет проблему, и всплывающее окно закрывает фокус.

+0

Ницца. Это на кнопке, кстати. Я изменил это на моей кнопке переключения, которая контролировала всплывающее окно, и это сработало. –

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