失去焦点时自动显示提示和关闭弹出窗口

时间:2014-08-24 16:14:12

标签: c# wpf xaml textbox popup

我有两个元素:TextBoxPopup,其中弹出窗口包含树视图,根据TextBox的文字显示一些提示。当textBox获得KeyDown事件时,KeyDown会直接执行pup.IsOpen=true以显示弹出提示。

但是,我还希望在鼠标单击TextBox时显示弹出提示,并在鼠标单击任何位置时自动关闭弹出窗口(TextBox和{{1除外)在Popup中)。

我尝试了一些案例,但效果不理想。

案例1:在TreeView中添加pup.IsOpen=true;,即使我点击窗口中的任何其他位置,弹出窗口也会保持打开状态。

案例2:在TextBox.PreviewMouseUp中添加pup.IsOpen=true,弹出提示仅在点击鼠标时显示。

案例3:将TextBox.PreviewMouseDownCheckBox一起使用Binding IsChecked可以正常使用。但是提示是根据TextBox的内容列出的,因此复选框不能为用户编辑...

现在是我的代码:

Popup.IsOpen

和事件功能:

<Window x:Class="popUpTesting.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>
        <TextBox 
            Name="SearchBox" 
            HorizontalAlignment="Center" 
            TextWrapping="Wrap" 
            Text="TextBox" 
            VerticalAlignment="Center" 
            KeyDown="SearchBox_KeyDown" PreviewMouseUp="SearchBox_PreviewMouseUp"
            />

        <Popup 
            Placement="Bottom" 
            AllowsTransparency="True"  
            PopupAnimation="Fade" 
            StaysOpen="false"
            x:Name="pup" 
            PlacementTarget="{Binding ElementName=SearchBox}"
            IsOpen="False"
            >
            <Grid>
                <TreeView HorizontalAlignment="Left" Height="200" VerticalAlignment="Top" Width="200">
                    <TreeViewItem Header="A">
                        <TreeViewItem Header="A1"/>
                    </TreeViewItem>
                    <TreeViewItem Header="B"></TreeViewItem>
                    <TreeViewItem Header="C"></TreeViewItem>
                    <TreeViewItem Header="D"></TreeViewItem>
                </TreeView>
            </Grid>
        </Popup>
    </Grid>
</Window>

1 个答案:

答案 0 :(得分:1)

在您的窗口中注册 PreviewMouseUp 事件并检查原始来源是否为 SearchBox ,然后将IsOpen设置为true,否则将其设置为假

XAML:

<Window PreviewMouseUp="Window_PreviewMouseUp">
  ...
</Window>

代码背后:

private void Window_PreviewMouseUp(object sender, MouseButtonEventArgs e)
{
    if (e.OriginalSource == SearchBox)
    {
        pup.IsOpen = true;
    }
    else
    {
        pup.IsOpen = false;
    }
}