6

我正在尝试创建一个下拉控件,其中包含一个 ToggleButton 和一个带有 TabControl 的 Popup 控件。我的问题是,除非我单击其中的某个控件,否则弹出窗口不会自动关闭。

考虑下面的示例,其中弹出窗口包含一个 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>

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

4

2 回答 2

8

问题在于ToggleButtonClickMode=Press。设置ClickMode=Release解决了问题并Popup关闭了焦点丢失。

于 2013-08-15T12:20:49.380 回答
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我刚刚分配truePopup.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>

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

于 2013-05-01T10:35:35.427 回答