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