首页 > 其他分享 >【Xaml】WPF中Popup 实现类智能感知

【Xaml】WPF中Popup 实现类智能感知

时间:2022-11-18 01:55:35浏览次数:53  
标签:Popup MailConfigSelection Xaml ConfigPopup popup Key WPF tb TextBox

首先要做的事情就是定义一个popup来显示我们需要展示的东西

<Popup x:Name="ConfigPopup" Height="auto" Width="150" StaysOpen="False" Placement="Bottom" IsOpen="False" HorizontalAlignment="Left">
                <Grid Width="auto" Height="auto">
                    <ListBox x:Name="MailConfigSelection" KeyDown="MailConfigSelection_OnKeyDown" IsTextSearchEnabled="True" ItemsSource="{Binding KeysCollection}"></ListBox>
                </Grid>
</Popup>

  这里使用的是用一个Listbox来做演示,也可以使用其他的控件或者改listbox的template。popup的staysopen代表失去焦点后还显不显示。listbox绑定到一个ObservableCollection来实时改变。

  后台代码

public ObservableCollection<string> KeysCollection { get; set; } = new ObservableCollection<string>(); 

...

private void MailConfigSelection_OnKeyDown(object sender, System.Windows.Input.KeyEventArgs e)
        {
            if (e.Key == Key.Enter)
            {
                ConfigPopup.IsOpen = false;
                System.Windows.Controls.ListBox lb = sender as System.Windows.Controls.ListBox;
                if (lb == null) return;

                string mailConfig = lb.SelectedItem.ToString();

                //Popup pp = (lb.Parent as Grid).Parent as Popup;
                TextBox tb = ConfigPopup.PlacementTarget as TextBox;
                int i = tb.CaretIndex;//获取呼出这个popup的textbox的当前光标位置
                tb.Text = tb.Text.Insert(i, mailConfig) + ">";//插入选择的字符串
                tb.CaretIndex = i + mailConfig.Length + 1;//移动光标
                tb.Focus();
            }
            else if (e.Key == Key.Escape)
            {
                ConfigPopup.IsOpen = false;
            }
        }

  给textbox加上keyup响应事件

private void TextBox_OnKeyUp(object sender, System.Windows.Input.KeyEventArgs e)
        {
            if (e.Key != Key.OemComma) return;

            TextBox tbm = e.OriginalSource as TextBox;
            if (tbm.Text.EndsWith("<") && KeysCollection.Count != 0)//这里是这样的条件,可以根据需求来改变
            {
                ShowPopUp(tbm.GetRectFromCharacterIndex(tbm.CaretIndex), tbm);
            }
}

  弹出popup时,我们希望popup出现在正在输入的textbox下面而且在输入的光标附近

private void ShowPopUp(Rect placementRect, TextBox tb)
        {
            ConfigPopup.PlacementTarget = tb;
            ConfigPopup.PlacementRectangle = placementRect;
            ConfigPopup.IsOpen = true;
            MailConfigSelection.Focus();
            MailConfigSelection.SelectedIndex = 0;
            var listBoxItem = (ListBoxItem)MailConfigSelection.ItemContainerGenerator.ContainerFromItem(MailConfigSelection.SelectedItem);
            listBoxItem.Focus();
        }

  我们先获取到当前光标的位置Rect,tbm.GetRectFromCharacterIndex(tbm.CaretIndex)来获取rect并传给popup的PlacementRectangle,这样popup出现的位置就是我们想要的了。

  在这个过程中发现弹出窗口后选择候选项时,按上下键有时候不管用,因为我们focus在popup上,上下键相应的框内所有内容的上下翻,我们希望的是在各个选项之间的切换,那么我们需要focus在里面的listitem上,通过MailConfigSelection.ItemContainerGenerator.ContainerFromItem(MailConfigSelection.SelectedItem)来获取到选中的listboxitem并把焦点给他即可。

  到此,一个类智能感知就完成了,可以通过其他的各种方式来进行优化。

转载于:https://www.cnblogs.com/leakeyash/p/5706707.html

标签:Popup,MailConfigSelection,Xaml,ConfigPopup,popup,Key,WPF,tb,TextBox
From: https://www.cnblogs.com/cdaniu/p/16901948.html

相关文章

  • 在WPF中使用Prism弹出自定义窗体样式的对话框
    摘要在Prism中弹出一个对话框,默认是一个Windows默认样式的窗口,会与自己所开发的项目完全不搭配,例如下面这样子如果为了迎合软件主体风格,可以做出类似这样效果其实原理......
  • 学习wpf笔记2 绑定 ——转[WPF学习之数据绑定]
    WPF中的数据绑定提供了很强大的功能。与普通的WinForm程序相比,其绑定功能为我们提供了很多便利,例如Binding对象的自动通知/刷新,Converter,ValidationRules,TwoWayBinding......
  • WPF添加GIF动画
    一:XamlAnimatedGifxmlns:gif="https://github.com/XamlAnimatedGif/XamlAnimatedGif"<Imagegif:AnimationBehavior.SourceUri="..\Images\startup.gif"gif:AnimationBe......
  • WPF应用程序(.NET Core)
    WPF应用程序(.NETCore)https://www.cnblogs.com/ZhuMeng-Chao/p/16410852.htmlhttps://www.cnblogs.com/ZhuMeng-Chao/category/2182960.html......
  • WPF-控件的使用-按钮
    WPF-控件的使用-按钮简介按钮这个控件的作用就是点击触发相应的事件,继承自ButtonBase类,按照官方的说法就是Button控件对来自鼠标、键盘、触笔或其他输入设备的用户输入做......
  • 在WPF中将XAML表格文档转换为PDF文件导出
    摘要编写文档模板页面1、新建Page页面,将顶部节点更改为FlowDocument,后台代码不需要,可直接删掉2、实现一个表格页面直接上代码,自己看,其中需要注意的是,如果非静态页面......
  • MAUI新生1.3-XAML语法基础:标记扩展原理
    标记扩展,本质上是IMarkupExtension或者IMarkupExtension<T>接口的实现类。这两个接口,均定义了ProvideValue方法。注意,IMarkupExtension<T>继承自IMarkupExtension,如果定义......
  • WPF 点击DataGrid中按钮无触发
    上干货<DataGridTemplateColumnHeader="操作"Width="1*"><DataGridTemplateColumn.CellTemplate>......
  • WPF打开windows弹窗与关闭
    //--------Window弹窗与关闭<DataGridTemplateColumnHeader="操作"Width="*"><DataG......
  • Mac开发_NSPopUpButton
    1、基础创建代码//创建NSPopUpButton*pop_btn=[[NSPopUpButtonalloc]init];//位置尺寸pop_btn.frame=CGRectMake(50,150,120,50);//添加[self.windo......