【问题标题】:Auto showing tips and closing popup when lost focus失去焦点时自动显示提示并关闭弹出窗口
【发布时间】:2014-08-24 16:14:12
【问题描述】:

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

但是,我还想在鼠标单击TextBox 时显示弹出提示,并在鼠标单击任何位置时自动关闭弹出窗口(除了弹出窗口中的TextBox 和TreeView)。

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

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

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

案例 3:使用 CheckBox 和 Binding IsChecked 到 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>

以及事件函数:

private void SearchBox_KeyDown(object sender, KeyEventArgs e)
{
    pup.IsOpen = true;        
}

private void SearchBox_PreviewMouseUp(object sender, MouseButtonEventArgs e)
{
    pup.IsOpen = true;
}

【问题讨论】:

    标签: c# wpf xaml textbox popup


    【解决方案1】:

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

    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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-29
      • 2012-10-01
      相关资源
      最近更新 更多