我有两个元素:TextBox
和Popup
,其中弹出窗口包含树视图,根据TextBox
的文字显示一些提示。当textBox获得KeyDown
事件时,KeyDown
会直接执行pup.IsOpen=true
以显示弹出提示。
但是,我还希望在鼠标单击TextBox
时显示弹出提示,并在鼠标单击任何位置时自动关闭弹出窗口(TextBox
和{{1除外)在Popup中)。
我尝试了一些案例,但效果不理想。
案例1:在TreeView
中添加pup.IsOpen=true;
,即使我点击窗口中的任何其他位置,弹出窗口也会保持打开状态。
案例2:在TextBox.PreviewMouseUp
中添加pup.IsOpen=true
,弹出提示仅在点击鼠标时显示。
案例3:将TextBox.PreviewMouseDown
与CheckBox
一起使用Binding IsChecked
可以正常使用。但是提示是根据TextBox的内容列出的,因此复选框不能为用户编辑...
现在是我的代码:
Popup.IsOpen
和事件功能:
<Window x:Class="popUpTesting.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<TextBox
Name="SearchBox"
HorizontalAlignment="Center"
TextWrapping="Wrap"
Text="TextBox"
VerticalAlignment="Center"
KeyDown="SearchBox_KeyDown" PreviewMouseUp="SearchBox_PreviewMouseUp"
/>
<Popup
Placement="Bottom"
AllowsTransparency="True"
PopupAnimation="Fade"
StaysOpen="false"
x:Name="pup"
PlacementTarget="{Binding ElementName=SearchBox}"
IsOpen="False"
>
<Grid>
<TreeView HorizontalAlignment="Left" Height="200" VerticalAlignment="Top" Width="200">
<TreeViewItem Header="A">
<TreeViewItem Header="A1"/>
</TreeViewItem>
<TreeViewItem Header="B"></TreeViewItem>
<TreeViewItem Header="C"></TreeViewItem>
<TreeViewItem Header="D"></TreeViewItem>
</TreeView>
</Grid>
</Popup>
</Grid>
</Window>
答案 0 :(得分:1)
在您的窗口中注册 PreviewMouseUp
事件并检查原始来源是否为 SearchBox
,然后将IsOpen设置为true,否则将其设置为假
XAML:
<Window PreviewMouseUp="Window_PreviewMouseUp">
...
</Window>
代码背后:
private void Window_PreviewMouseUp(object sender, MouseButtonEventArgs e)
{
if (e.OriginalSource == SearchBox)
{
pup.IsOpen = true;
}
else
{
pup.IsOpen = false;
}
}