WPF 弹出框Popup常见用法和焦点问题

本文详细介绍了WindowsPresentationFoundation(WPF)中Popup控件的关键属性如IsOpen、StaysOpen、PopupAnimation等,以及焦点处理策略,包括焦点转移和鼠标事件处理。
摘要由CSDN通过智能技术生成

1.常用属性说明
IsOpen: 布尔值,指示 Popup 控件是否显示
StaysOpen: 布尔值,指示在 Popup 控件失去焦点的时候,是否关闭 Popup 控件的显示
PopupAnimation:指示显示窗口时是否使用动画,只有在 AllowsTransparency 等于true时此属性才有用
Popup 窗口本身是一个不可见的元素,只有在窗口上放置了信息后才能显示
Popup的定位方式与一般控件的定位方法不一样, Popup 使用五个属性来设定位置信息:
PlacementTarget:设定 Popup 定义所相对的控件,如果没有为属性为 NULL,则 Popup 定位相对于屏幕的左上角
Placement:一个枚举值,指定 Popup 控件的定位方式
PlacementRectangle:设定一个矩形,在 Popup 控件显示时,位置将相对于此矩形来显示,此矩形的位置也相对于PlacementTarget 属性所设定的控件
HorizontalOffset:指定一个值,指示 Popup 的位置所需水平移动多少个象素
VerticalOffset:指定一个值,指示 Popup 的位置所需垂直移动多少个象素

<Popup x:Name="Popup" AllowsTransparency="True" Focusable="True" StaysOpen="False" Placement="Bottom" PopupAnimation="Slide" PlacementTarget="{Binding ElementName=PART_popDown}">
    <ListBox>
        <ListBoxItem>1</ListBoxItem>
        <ListBoxItem>2</ListBoxItem>
        <ListBoxItem>3</ListBoxItem>
    </ListBox>
</Popup>

2.Popup控件显示

        1)、Popup控件永远不会自动显示,为了显示Popup控件必须设置IsOpen属性。

  2)、默认情况下,Popup.StaysOpen属性被设置为True,并且Popup控件会一直显示,直到显示低将IsOpen属性设置为False。如果将Popup.StaysOpen属性设置为False,当用户在其他地方点击鼠标时,Popup控件就会消失。

  3)、如果Popup控件的IsOpen属性设置为True时,通过Popup控件的PopupAnimation属性可以设置Popup控件的显示方式。

  4)、由于Popup控件不和任何控件相关联,所以无论在哪定义Popup标签都无所谓。

3.Popup控件焦点问题

        1)、在Click或者MouseUp事件中将Popup的isopen设置为true时,Popup会展示,但是焦点不会转移到Popup,此时如果用Popup.Focus(),是无法将焦点转移过去的,只能借助user32的SetFocus方法。此时如果Popup中有Textbox,要给到焦点,那么要先给到Popup焦点,再给到Textbox焦点,否则输入法不会随动。

[DllImport("user32")]
public static extern IntPtr SetFocus(IntPtr hWnd);

private void Button_Click(object sender, RoutedEventArgs e)
{
    popup.IsOpen = true;
    //必须显式让 Popup 获得焦点,否则内部的 TextBox 输入时,输入框无法跟随。
    var source = (HwndSource) PresentationSource.FromVisual(popup.Child);
    SetFocus(source.Handle);
    //必须显式让文本框获得焦点(如果有的话)。
    Keyboard.Focus(textBox);
}
 


        2)、获取或设置一个值,该值指示当 Popup 控件焦点不再对准时,是否关闭该控件。当将 StaysOpen 属性设为 True 时,Popup 始终处于打开状态,直到通过将 IsOpen 属性设置为False将其显式关闭。当 StaysOpen 设置为False时,Popup 控件会截获所有鼠标事件和键盘事件,以确定在 Popup 控件之外发生这些事件之一,最明显的区别是当设置IsOpen 为True时弹出Popup控件,当使用鼠标在另外的地方进行点击时Popup失去焦点,同时Popup隐藏,而当StaysOpen 设置为True时,当Popup失去焦点时,Popup则不会隐藏,此时仍然会保持打开的状态。

 private void BorderPopDown_MouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
 {
     if (popup!= null)
     {
        opup.IsOpen = true;
        popup.Child.CaptureMouse();
     }
 }

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值