弹出窗口不会失去焦点并关闭,直到我点击其中的控件

时间:2013-05-01 10:02:15

标签: wpf wpf-controls

我试图创建一个下拉控件,其中包含一个ToggleButton和一个带有TabControl的Popup控件。我的问题是,Popup不会自动关闭,除非我点击了其中的某个控件。

考虑下面的示例,其中弹出窗口包含一个TabControl,它本身包含一个TabItem中的Calendar控件。

预期的行为是Popup在失去焦点时关闭(即点击容器窗口),但为了让弹出窗口触发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>

Popup的打开/关闭是在ToggleButton的Checked / Unchecked事件中控制的。

2 个答案:

答案 0 :(得分:8)

问题在于ClickMode =按。设置ClickMode = Release可修复问题,Popup会在焦点丢失时关闭。

答案 1 :(得分: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>

当我打开弹出窗口并尝试使用其标题栏移动窗口时,弹出窗口将关闭,我必须再次单击并拖动标题栏以实际执行移动操作。您的代码中是否还有某些内容不属于您的问题?我仍然无法重建你的问题。