【问题标题】:Wrong alignment of ContextMenu and Popup WPF controls on Windows 10Windows 10 上 ContextMenu 和 Popup WPF 控件的错误对齐
【发布时间】:2016-08-16 17:02:32
【问题描述】:

这是一个非常奇怪的问题,我希望有人知道如何解决。 情况:

  1. 我们的 WPF 项目有一个表单,我们在该表单上显示上下文菜单(ContextMenu 控件)和弹出窗口(Popup 控件)以响应某些用户操作。在大多数情况下,它发生在鼠标单击某个文本块时。 这是一个例子:

            popup = new Popup {
                Placement = PlacementMode.Relative,
                PlacementTarget = textBlock,
                StaysOpen = false
            }; 
    
            .   .   .   .   .
            //later on mouse click:
            popup.IsOpen = true;
    
  2. 弹出窗口必须与其放置目标的左上角对齐(在我们的示例中为一些文本块),因此 - 将其重叠。它在所有情况下都运行良好,除了具有平板模式的 Windows 10 机器(如 MS Surface Pro)。 在这种环境中,我们的弹出窗口出现在放置目标的左侧,因此 - 不要与它们重叠。

我们发现它的发生是由于本文中描述的特殊 Windows 10 选项: http://www.isunshare.com/windows-10/show-context-menu-on-left-or-right-in-windows-10.html

此选项默认设置为“右手”(这是可以理解的),但我不明白为什么它会以这种方式影响 Popup 控件以及为什么即使在桌面模式下也会发生这种情况。

如果能找到一种方法来改变这种默认行为并让我们的 Popup 在任何情况下都显示为与父控件的左上角对齐,那就太好了。 有人知道怎么做吗?

【问题讨论】:

标签: c# wpf popup windows-10


【解决方案1】:

您可以指定PlacementRectangle:

<Border Width="300" Height="20" Background="Yellow">
  <Popup IsOpen="True" Placement="Left">
      <Popup.PlacementRectangle>
        <Rect X="0" Y="20" Width="0" Height="0" />
      </Popup.PlacementRectangle>
    <Border Width="100" Height="100" Background="Blue"></Border>
  </Popup>
</Border>

看起来像这样,即使启用了右手平板电脑模式:

这里的技巧是Y 属性设置为正确的高度。如果您有一个固定高度的弹出窗口,那可能没问题。否则,您可以尝试 bing 到内容的 ActualHeight,但由于 Rect.Y 不是依赖属性,因此您需要一个从 doubleRect 的转换器。

【讨论】:

    猜你喜欢
    • 2010-10-30
    • 2010-11-17
    • 1970-01-01
    • 2010-09-18
    • 1970-01-01
    • 1970-01-01
    • 2013-08-23
    • 2015-10-25
    • 1970-01-01
    相关资源
    最近更新 更多