如何在鼠标指向窗口的顶部位置时触发事件?

问题描述:

嗨我正在开发一个WPF应用程序,我需要在窗口的顶部显示一个DockPanel,但只有在鼠标指向该位置时才会显示(与Windows 8.1标题栏完全相同,如果将鼠标指向顶部,十字按钮和最小化按钮来),如果鼠标移出窗口的一侧,并在其他地方的子元素<StackPanel>将覆盖整个窗口,并将显示数据,但只要鼠标指向UI的顶部位置,我应显示标题。我附上了我的想法的图像。任何人都可以提出建议?如何在鼠标指向窗口的顶部位置时触发事件?

经过大量的谷歌搜索,我发现获得屏幕分辨率和从窗口的高度和宽度中减去会给我想要的结果。但我认为这不是最终的解决方案,必须有其他方式。 Header

至于建议我尝试过这种方式

<Grid x:Name="gdMainWindow" > 
     <Grid.RowDefinitions> 
      <RowDefinition Height="20" /> 
      <RowDefinition Height="*" /> 
</Grid.RowDefinitions> 

<Rectangle Grid.Row="0" Fill="Transparent" Height="20" 
    MouseEnter="Dock_MouseEnter" 
    MouseLeave="dp_MouseLeave"    
/> 

<DockPanel Grid.Row="0" Background="Black" > 
    <Image Source="Images/candle-blownout.jpg" Stretch="UniformToFill"/> 
</DockPanel > 

而在Dock_MouseEnter

private void Dock_MouseEnter (object sender, MouseEventArgs e) 
{ 
    dp.Visibility = Visibility.Visible; 
} 

private void dp_MouseLeave (object sender, MouseEventArgs e) 
{ 
    dp.Visibility = Visibility.Collapsed; 
} 

但它留下,在顶部,白20像素的空间,图像不调整到第一排。

+1

当我这样做的时候,我只是将一个5px的Rectangle像一个填充=透明的hittestvisibility和一个mousenter eventtrigger一样放在顶部,然后在菜单上有一个MouseLeave触发器来将它折叠再次。 – 2014-10-17 15:39:43

你可以这样做:

<Grid> 
    <Grid.RowDefinitions> 
      <RowDefinition Height="20"/> 
      <RowDefinition Height="*"/> 
    </Grid.RowDefinitions> 
    <Rectangle x:Name="TopPart" MouseEnter="MouseEnterEvent" MouseLeave="MouseLeaveEvent" Fill="Transparent" Grid.Row="0" /> 
    <StackPanel x:Name="RestOfContent" Grid.Row="0" Grid.RowSpan="2/> 
</Grid> 

这是一个伪XAML,所以一定要小心,一些属性可能被命名为略有不同。

您创建了一个Grid,它有两行,第一个是您想要的反应顶部的尺寸,第二个是其余部分。

在第一个Grid.Row中,您设置了一个Rectangle或另一个透明元素,您只需在鼠标进入或离开时检测该元素即可处理相关事件。其余的内容将被放置在相同的Grid.Row中,但将有一个RowSpan,它可以让它延伸窗口的其余部分。

如果您对这种方法有疑问,I.E. Rectangle与一些不允许你与之交互的内容重叠,你需要在组件的ZIndex上稍微玩点儿,同时确保你使用这个作为你窗口的顶部,这样Rectangle赢得了'向下滚动。

+1

我会抛弃你的rowdefinitions并以不同的方式处理它,所以顶部没有多少奇怪的差距。也许我也应该发布一个 – 2014-10-17 16:27:40

+1

不应该有差距,因为这两个元素开始在同一行(0) – 2014-10-17 16:35:27

+0

哦,我得到你,雅我没有看到,我不打扰,把行= 0这样当我看到那种习惯时,我认为这意味着另一排。足够公平:) – 2014-10-17 18:27:46