2017-09-30 30 views
1

我做了一個小測試應用程序來說明我不明白的行爲:2個按鈕,如果鼠標進入左邊的按鈕彈出顯示(工程),如果鼠標進入彈出的按鈕應該立即消失(不起作用)。在我的真實應用程序中,我沒有按鈕,僅在此示例中進行簡單測試,因此鼠標移動很重要,不能使用按鈕單擊。Popup的幾個問題(不隱藏)

我看到的是以下行爲:

  • 如果彈出顯示,右鍵鼠標輸入(隱藏)完全不反應,似乎彈出已經得到了重點,我有在啓用鼠標右鍵之前點擊主窗口。設置Popup.Focusable = false(XAML)或者在設置Popup.Isopen = true之後嘗試將焦點設置爲網格(C#代碼)不會有幫助。
  • 當我嘗試通過設置Popup.IsOpen = false來隱藏彈出窗口時,彈出窗口保持可見並且不會消失。只有當我點擊主窗口頂欄時,或者當我將鼠標懸停在顯示工具提示的示例的最小化按鈕上時,彈出窗口突然消失。在幾個UI元素上調用UpdateLayout()不會有幫助。

我想以下幾點:

  1. 一旦彈出所示,隱藏按鈕仍然應該在鼠標輸入反應。
  2. 設置Popup.IsOpen = false應該直接讓彈出消失。下面

見代碼,XAML:

<Window x:Class="WpfApplication1.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:WpfApplication1" 
    mc:Ignorable="d" 
    x:Name="MyWindow" 
    Title="MainWindow" Height="500" Width="800"> 
<Grid> 
    <Grid x:Name="MyGrid" Margin="100" Background="Green"> 

     <TextBox x:Name="MyText" Width="100" Height="50" Margin="0,50" HorizontalAlignment="Center"></TextBox> 

     <Button Width="75" Height="50" Margin="20,100" HorizontalAlignment="Left" 
       Content="Show" MouseEnter="MouseEnterShow"></Button> 
     <Button Width="75" Height="50" Margin="20,100" HorizontalAlignment="Right" 
       Content="Hide" MouseEnter="MouseEnterHide"></Button> 

     <Popup x:Name="MyPopup" PlacementTarget="{Binding ElementName=MyGrid}" Placement="RelativePoint" 
       AllowsTransparency="false" IsOpen="False" StaysOpen="False" 
       Focusable="False" 
       Width="200" Height="200"     
       HorizontalAlignment="Left" VerticalAlignment="Top" 
       HorizontalOffset="-50" VerticalOffset="-50"> 
      <Grid> 
       <Canvas Background="BlanchedAlmond" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"></Canvas> 
      </Grid> 
     </Popup> 
    </Grid> 
</Grid> 
</Window> 

和C#:

using System.Windows; 
using System.Windows.Input; 

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

    private void MouseEnterShow(object sender, MouseEventArgs e) 
    { 
     MyPopup.IsOpen = true; 
     MyGrid.Focus();// Does not help 

     MyText.Text = "Show"; 
     System.Diagnostics.Debug.WriteLine("Show"); 
    } 

    private void MouseEnterHide(object sender, MouseEventArgs e) 
    { 
     MyPopup.IsOpen = false; 
     MyGrid.UpdateLayout();// Does not help 

     MyText.Text = "Hide"; 
     System.Diagnostics.Debug.WriteLine("Hide"); 
    } 
} 
} 

回答

0

一些暴力破解後,我已經成功地使其工作:

1.設置Popup屬性StaysOpen到true,而不是false

2.代碼後面

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

private void MouseEnterHide(object sender, MouseEventArgs e) 
{ 
    MyPopup.IsOpen = false; 
} 
+0

這是一個進步,謝謝。隱藏按鈕上的鼠標確實會在彈出窗口顯示時作出響應,但由於某種原因,在「Popup.IsOpen = false」之後,彈出窗口仍然保持可見狀態,直到我單擊主窗口頂欄或將鼠標懸停在最小化按鈕上。奇怪... –

+0

似乎現在工作,一旦我設置「AllowsTransparency =」true「」。但我不明白這背後的理由...... –