【问题标题】:How to Fire an event when mouse points to the top location of the window?当鼠标指向窗口的顶部位置时如何触发事件?
【发布时间】:2014-10-17 15:29:06
【问题描述】:

您好,我正在开发一个 WPF 应用程序,我需要在窗口顶部显示 DockPanel,但它只会显示鼠标指向该位置,(就像 Windows 8.1 标题栏一样,如果您将鼠标指向在顶部,十字按钮和最小化按钮出现),如果鼠标移出窗口的一侧和其他地方,子元素<StackPanel> 将覆盖整个窗口并显示数据,但只要鼠标指向顶部位置UI,我应该显示标题。我附上了一张我的想法的图片。任何人都可以提出一些建议吗?

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

按照建议我尝试过这种方式

<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 像素空间留为白色,图像不会调整到第一行。

【问题讨论】:

  • 当我这样做时,我只是在顶部抛出一个 5px 矩形,填充 = 透明以实现 hittestvisibility 和 mouseenter 事件触发器以使您的菜单在其顶部可见,然后在菜单上有一个MouseLeave 触发器再次折叠它。

标签: c# .net wpf windows xaml


【解决方案1】:

你可以这样做:

<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 不会向下滚动。

【讨论】:

  • 我会放弃你的行定义并以不同的方式处理它,所以顶部不会有很大的奇怪差距。也许我也应该发一个
  • 不应有间隙,因为两个元素都从同一行 (0) 开始
  • 哦,我知道了,是的,我没看到,我不会费心设置 row=0,所以当我看到这只是出于习惯时,我认为这意味着另一行。很公平:)
  • 我尝试了你的建议,但它留下了 20 像素作为白色背景。图片未调整大小以覆盖第一行。
猜你喜欢
  • 2022-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-25
  • 1970-01-01
相关资源
最近更新 更多