2

マウスオーバーイベントでポップアップが開くラベルがあります。

ポップアップウィンドウで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;
        }
4

2 に答える 2

4

コードをどれだけクリーンに保ちたいかに応じて、必要に応じてwpfでのみこれを処理できます。このようにして、MouseLeave / MouseEnterを検出する代わりに、IsMouseOverを使用できます。

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>
于 2012-09-07T12:49:29.333 に答える
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

于 2012-09-07T12:27:36.083 に答える