2017-01-23 17 views
1

ポップアップコントロールを開くMouseEnterイベントで簡単なボーダーコントロールがあります。ポップアップは境界線よりも大きく、境界の境界を超えています。ポップアップにもいくつかのボタンとテキストブロックがあるので、私はそれを何らかのコントロールをする必要があります。今、私が得たいもの:マウスがボーダーに入る - ポップアップが表示されます。マウスが境界線とポップアップを離れると、ポップアップが閉じます。したがって、マウスが境界を越えていないのにポップアップの上にあるときは、ポップアップは開いたままです。私はクリックで閉じたくない。手伝って頂けますか? WPFのポップアップコントロールは私にとっては紛らわしいものです。WPFポップアップ - マウスでのみコントロールとポップアップを残す

編集: 右、コード:

<Window x:Class="Sandbox.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:local="clr-namespace:Sandbox" 
    mc:Ignorable="d" 
    Title="MainWindow" Height="350" Width="525"> 
<Grid Margin="20"> 
    <Popup PopupAnimation="Fade" Placement="Top" PlacementTarget="{Binding ElementName=OpenPopupBorder}" AllowsTransparency="True" StaysOpen="True" x:Name="DeviceStatusSnippetPopup"> 
     <Border Background="White" Padding="5" BorderBrush="Black" BorderThickness="1"> 
      <Grid> 
       <StackPanel Orientation="Vertical"> 
        <TextBlock HorizontalAlignment="Center" Text="Device status snippet" Margin="0 10 0 10"/> 
        <StackPanel Orientation="Horizontal"> 
         <Button Style="{StaticResource btn-default}" Margin="0 0 5 0" Content="Go to device"/> 
         <Button Style="{StaticResource btn-default}" Content="Refresh device"/> 
        </StackPanel> 
       </StackPanel> 
      </Grid> 
     </Border> 
    </Popup> 
    <Border x:Name="OpenPopupBorder" Width="90" Height="30" Background="LightGray" MouseEnter="Border_MouseEnter"/> 
</Grid> 

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    private void Border_MouseEnter(object sender, MouseEventArgs e) 
    { 
     DeviceStatusSnippetPopup.IsOpen = true; 
    } 
} 
+0

ここでコードを共有しますか? – MikkaRin

+0

'IsMouseOver == true'、setter' popup.IsOpen = true'、 'IsMouseOver == false' =>' popup.IsOpen = false'で 'IsMouseOver'プロパティの' popup'のトリガを設定するだけです。 。それは本当に簡単です。 – Shakra

答えて

0

コードビハインド:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

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

    private void Popup_MouseLeave(object sender, MouseEventArgs e) 
    { 
     if (!OpenPopupBorder.IsMouseOver) 
      DeviceStatusSnippetPopup.IsOpen = false; 
    } 


    private void Border_MouseLeave(object sender, MouseEventArgs e) 
    { 
     if (!DeviceStatusSnippetPopup.IsMouseOver) 
      DeviceStatusSnippetPopup.IsOpen = false; 
    } 
} 

XAML(マイナスウィンドウ):

<Grid Margin="20"> 
    <Popup MouseLeave="Popup_MouseLeave" PopupAnimation="Fade" Placement="Top" PlacementTarget="{Binding ElementName=OpenPopupBorder}" AllowsTransparency="True" StaysOpen="True" x:Name="DeviceStatusSnippetPopup"> 
     <Border Background="White" Padding="5" BorderBrush="Black" BorderThickness="1"> 
      <Grid> 
       <StackPanel Orientation="Vertical"> 
        <TextBlock HorizontalAlignment="Center" Text="Device status snippet" Margin="0 10 0 10"/> 
        <StackPanel Orientation="Horizontal"> 
         <Button Margin="0 0 5 0" Content="Go to device"/> 
         <Button Content="Refresh device"/> 
        </StackPanel> 
       </StackPanel> 
      </Grid> 
     </Border> 
    </Popup> 
    <Border x:Name="OpenPopupBorder" Width="90" Height="30" Background="LightGray" MouseEnter="Border_MouseEnter" MouseLeave="Border_MouseLeave"/> 
</Grid> 

基本的には、ボーダーとポップアップの両方に対してMouseLeaveのイベントハンドラーを実装し、ポップアップを閉じる前にマウスが上にあるかどうかをチェックします。

+0

これが解決策です!ありがとう! – Paweu

関連する問題