[WPF]如何关闭弹窗
[WPF]How to close popup
我想通过控制 StaysOpen 值自动关闭弹出窗口 属性。每当输入文本或单击鼠标左键时,我都会打开它。
StaysOpen 设置为 false。
<Grid>
<TextBox x:Name="textBox" PreviewMouseLeftButtonUp="textBox_PreviewMouseLeftButtonUp"/>
<Popup IsOpen="{Binding IsOpen, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" OpacityMask="Transparent" StaysOpen="{Binding StaysOpen, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"
AllowsTransparency="True" PlacementTarget="{Binding ElementName=textBox}">
<Border CornerRadius="5" Background="#FF303030" Width="{Binding ActualWidth, ElementName=textBox}">
...
</Border>
</Popup>
</Grid>
private void textBox_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
if ((sender as TextBox).Text.Length > 0)
{
IsOpen = !IsOpen;
}
}
当在文本框中输入文本且 Popup 的 IsOpen 为 true 时,可以在控件外边单击时自动关闭弹出窗口。但是,在 textBox_PreviewMouseLeftButtonUp 相同情况下的函数调用状态下,不会自动关闭它。(IsOpen 也为真)
如果我在textBox_PreviewMouseLeftButtonUp中更改为e.handel = true,则可以通过单击它的外部自动关闭。但是它有严重的问题,不能选择弹出窗口中的任何控件。所以不能用这种方式。
如何通过单击控件的一侧来安全地自动关闭弹出窗口?
您可以使用 TextBox
的 LostKeyboardFocus
事件,当 TextBox
不再是键盘输入的目标时(即当用户单击或离开控制)。
private void textBox_LostKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
{
IsOpen = false;
}
此外,对于打开弹出窗口,我可能建议使用 GotKeyboardFocus
。 PreviewMouseLeftButtonUp
仅当用户通过左键单击设置焦点时才有效,但用户也可以使用 Tab 等方式
不完美,但我解决了。
我添加了 MouseLeftButtonUpEvent 而不是 PreviewMouseLeftButtonUp。
textBox.AddHandler(MouseLeftButtonUpEvent,
new RoutedEventHandler(textBox_MouseLeftButtonUp),
true);
点击外部控件时,弹窗自动关闭,点击TextBox时,弹窗自动打开
但是,如果显示 Pop up,则单击 TextBox 时,Pop up 不会隐藏。
反正我觉得够了
我想通过控制 StaysOpen 值自动关闭弹出窗口 属性。每当输入文本或单击鼠标左键时,我都会打开它。
StaysOpen 设置为 false。
<Grid>
<TextBox x:Name="textBox" PreviewMouseLeftButtonUp="textBox_PreviewMouseLeftButtonUp"/>
<Popup IsOpen="{Binding IsOpen, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" OpacityMask="Transparent" StaysOpen="{Binding StaysOpen, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"
AllowsTransparency="True" PlacementTarget="{Binding ElementName=textBox}">
<Border CornerRadius="5" Background="#FF303030" Width="{Binding ActualWidth, ElementName=textBox}">
...
</Border>
</Popup>
</Grid>
private void textBox_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
if ((sender as TextBox).Text.Length > 0)
{
IsOpen = !IsOpen;
}
}
当在文本框中输入文本且 Popup 的 IsOpen 为 true 时,可以在控件外边单击时自动关闭弹出窗口。但是,在 textBox_PreviewMouseLeftButtonUp 相同情况下的函数调用状态下,不会自动关闭它。(IsOpen 也为真)
如果我在textBox_PreviewMouseLeftButtonUp中更改为e.handel = true,则可以通过单击它的外部自动关闭。但是它有严重的问题,不能选择弹出窗口中的任何控件。所以不能用这种方式。
如何通过单击控件的一侧来安全地自动关闭弹出窗口?
您可以使用 TextBox
的 LostKeyboardFocus
事件,当 TextBox
不再是键盘输入的目标时(即当用户单击或离开控制)。
private void textBox_LostKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
{
IsOpen = false;
}
此外,对于打开弹出窗口,我可能建议使用 GotKeyboardFocus
。 PreviewMouseLeftButtonUp
仅当用户通过左键单击设置焦点时才有效,但用户也可以使用 Tab 等方式
不完美,但我解决了。
我添加了 MouseLeftButtonUpEvent 而不是 PreviewMouseLeftButtonUp。
textBox.AddHandler(MouseLeftButtonUpEvent,
new RoutedEventHandler(textBox_MouseLeftButtonUp),
true);
点击外部控件时,弹窗自动关闭,点击TextBox时,弹窗自动打开
但是,如果显示 Pop up,则单击 TextBox 时,Pop up 不会隐藏。
反正我觉得够了