鼠标离开时关闭wpf弹出窗口

时间:2012-09-07 11:26:15

标签: c# wpf events

我有一个标签,其鼠标悬停事件会打开一个弹出窗口。

我正在尝试在弹出窗口中处理mouseleave事件并关闭弹出窗口。

我遇到的问题是,在我点击弹出窗口外的任何地方之前,mouseleave事件不会被触发。

有人可以告诉我我做错了什么吗?

继承代码。

XAML:

<Popup Name="myPopup" IsOpen="False" PlacementTarget="{Binding ElementName=myButton}" StaysOpen="False" MouseLeave="myPopup_MouseLeave">

    <DataGrid MinHeight="400" MinWidth="300" Name="dtgPopup" AutoGenerateColumns="False" ItemsSource="{Binding}" SelectionChanged="dtgPopup_SelectionChanged"  IsReadOnly="True" CanUserAddRows="False">

    </DataGrid>

</Popup>

<Label Name="recentPanels" Content="Recent Panels" MouseEnter="recentPanels_MouseEnter"/>

事件处理程序:

private void recentPanels_MouseEnter(object sender, MouseEventArgs e)
        {
            myPopup.IsOpen = true;
        }

        private void myPopup_MouseLeave(object sender, MouseEventArgs e)
        {
            myPopup.IsOpen = false;
        }

2 个答案:

答案 0 :(得分:4)

如果您愿意,您可以仅在wpf中处理此问题,具体取决于您希望保持密码的清洁程度。这样您就可以使用IsMouseOver而不是检测MouseLeave / MouseEnter。

在TextBlock中使用MultiDataTrigger触发资源,如下所示:

<MultiDataTrigger>
  <MultiDataTrigger.Conditions>
    <Condition Binding="{Binding Mode=OneWay, RelativeSource={RelativeSource Self}, Path=IsMouseOver}" Value="True" />
  </MultiDataTrigger.Conditions>
  <Setter TargetName="myPopup" Property="IsOpen" Value="True" />
</MultiDataTrigger>

答案 1 :(得分:2)

根据我的经验,似乎需要鼠标点击才能意识到鼠标指针实际上已经离开了表单或弹出窗口。解决方法很容易实现如下,而不是使用MouseLeave事件使用OnMouseLeave。

protected virtual void OnMouseLeave(MouseEventArgs e)
{
    myPopup.IsOpen = false;
}

更多信息:http://msdn.microsoft.com/en-us/library/system.windows.controls.control.onmouseleave(v=vs.95).aspx