【问题标题】:WPF popup with textbox?带有文本框的WPF弹出窗口?
【发布时间】:2019-05-17 01:02:10
【问题描述】:

我正在尝试创建一个控件,当用户在文本框中键入内容时,它会显示搜索结果。为此,我有一个文本框和一个弹出窗口,当用户在其中输入内容时会显示(就像谷歌搜索框一样)。像这样,

<Grid> <TextBox Name="userEntry" /> <Popup /> </Grid>

现在,当用户开始在文本框中输入内容时,我希望弹出窗口显示并保持打开状态,直到用户关注其他一些 ui 控件或输入的文本为空。 我无法轻松实现这一点,并且想知道在 wpf 中是否有其他更好的方法可以做到这一点。 问候

【问题讨论】:

  • 替代什么?你没有展示你的方式,所以我们怎么知道有什么替代方法?
  • 我做到了...我想要一个类似 google 的搜索框功能,我在文本框中输入一些东西,我在它下方显示一个弹出窗口,列出结果..但我遇到焦点问题等问题...我正在研究的另一种选择是...重新设置组合框的样式以实现类似的效果。

标签: c# wpf


【解决方案1】:

XAML:

  <Window>
     <Grid>
        <Grid.RowDefinitions>
             <RowDefinition />
             <RowDefinition />
        </Grid.RowDefinitions>

        <Button x:Name="btn" Content="Open Search Window"  Height="30" Width="150" Click="btn_Click"/> 

        <Popup x:Name="popup"  PlacementTarget="{Binding ElementName=btn}" Placement="Bottom"  Width="200" Height="100" Margin="0,20,0,0">
           <Border BorderBrush="Black" BorderThickness="2" Background="AliceBlue">
               <TextBox x:Name="txtBox" VerticalAlignment="Center" Margin="15,0,15,0"/> 
           </Border>
        </Popup>

        <TextBox x:Name="focusTarger" Text="Focus Me !" Grid.Row="1" HorizontalAlignment="Center" VerticalAlignment="Center" Width="200" TextAlignment="Center" FontSize="16"/>

    </Grid> 
  </Window>

CS:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        GotFocus += MainWindow_GotFocus;
    }

    void MainWindow_GotFocus(object sender, RoutedEventArgs e)
    {
        FrameworkElement element = (FrameworkElement)e.OriginalSource;

        if (txtBox == element || popup == element || element.Parent == popup)
            return;

        popup.IsOpen = !string.IsNullOrEmpty(txtBox.Text);
    }

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

【讨论】:

  • 谢谢eran!让我试试看。