【发布时间】:2014-08-24 16:14:12
【问题描述】:
我有两个元素:一个TextBox 和一个Popup,其中弹出窗口包含一个树视图,以根据TextBox 的文本显示一些提示。当textBox得到KeyDown事件时,KeyDown直接执行pup.IsOpen=true,显示弹窗提示。
但是,我还想在鼠标单击TextBox 时显示弹出提示,并在鼠标单击任何位置时自动关闭弹出窗口(除了弹出窗口中的TextBox 和TreeView)。
我尝试了一些案例,但效果不佳。
案例1:在TextBox.PreviewMouseUp中添加pup.IsOpen=true;,即使我点击窗口中的任何其他位置,弹出窗口也会保持打开状态。
案例2:在TextBox.PreviewMouseDown中添加pup.IsOpen=true,弹出提示只在鼠标持续点击时显示。
案例 3:使用 CheckBox 和 Binding IsChecked 到 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>
以及事件函数:
private void SearchBox_KeyDown(object sender, KeyEventArgs e)
{
pup.IsOpen = true;
}
private void SearchBox_PreviewMouseUp(object sender, MouseButtonEventArgs e)
{
pup.IsOpen = true;
}
【问题讨论】: