gpt4 book ai didi

c# - 为什么 WPF Popup PlacementRectangle 会导致裁剪?

转载 作者:行者123 更新时间:2023-12-05 07:59:10 26 4
gpt4 key购买 nike

在我正在处理的 WPF 应用程序中,我在 map 上有图标,单击时会在弹出窗口中显示上下文菜单。因为我想在图标下方对齐上下文菜单,所以我将 PlacementRectangle 与图标图像的矩形和 Placement.Bottom 一起使用。

这在大多数情况下工作正常,但一些图标的上下文菜单超过屏幕高度的一半(在 1024x768 屏幕上),并且当靠近屏幕边缘时,弹出窗口会变得越来越与边缘对齐后剪裁。

我已阅读docs多次对此进行讨论,但看不到对我所看到的行为的解释。具体来说,我看到的行为是:

当图标靠近屏幕中心,但太低以至于菜单无法容纳在其下方时,弹出窗口会按预期翻转到图标的顶部(目标原点和弹出窗口对齐点更改)。当生成的翻转使弹出窗口的顶部超过屏幕的顶部边缘时,弹出窗口的顶部将按预期重新与屏幕对齐。但是,Popup 的底部边缘不会随着 Popup 的其余部分向下移动,从而导致剪切 Popup 的底部内容(虽然有足够的空间可以扩展)。这似乎反驳了它首先转移到屏幕边缘的原因(“出于安全考虑”......)。

来自docs我希望所有这些行为都是相同的,除了最后的剪辑,如果我使用 Placement.MousePlacement.MousePoint,整个 Popup 会正确移动.

我在 msdn 文档或谷歌搜索中找不到对此行为的解释,这是错误还是预期行为?是否有使用 PlacementRectangle 并防止产生裁剪的解决方法或技巧?

我创建了一个简单的 WPF 示例应用程序来演示该问题。它只是一个带有 Canvas 的窗口,其中包含一个名为“Rec”的矩形。该代码有一个事件处理程序:

    private void Window_MouseDown( object sender, MouseButtonEventArgs e )
{
// get mouse coordinates at click
var c = Mouse.GetPosition(this);
var cs = PointToScreen(c);

// an image to visualize popup clipping
var img = new Image() { Source = new BitmapImage( new Uri( "pack://application:,,,/test.png" ) ) };
img.Width = 150;
img.Height = 500;

// visually show the placement rectangle
Canvas.SetLeft( Rec, c.X );
Canvas.SetTop( Rec, c.Y );

var p = new Popup()
{
Placement = PlacementMode.Bottom,
PlacementRectangle = new Rect( cs.X, cs.Y, 40, 60 ),
//Placement = PlacementMode.Mouse,
StaysOpen = false,
Child = img,
};

p.IsOpen = true;
}

注意:我尝试使用 PlacementTarget 并获得相同的裁剪行为。

最佳答案

由于没有人回答这个问题,而且我也没有找到关于这个问题的更多信息,我猜这是一个错误。我找到了一个解决方法,我想我会发布它以防其他人遇到它:

使用带有放置回调的自定义放置可以让您模仿 Popup 的预期行为并且不执行任何裁剪:

    var p = new Popup()
{
PlacementRectangle = new Rect( cs.X, cs.Y, 40, 60 ),
Placement = PlacementMode.Custom,
CustomPopupPlacementCallback = new CustomPopupPlacementCallback( placePopup ),
StaysOpen = false,
Child = img,
};

我使用的放置回调:

private CustomPopupPlacement[] placePopup( Size popupSize, Size targetSize, Point offset )
{
Debug.WriteLine( "{0}; {1}; {2}", popupSize.ToString(), targetSize.ToString(), offset.ToString() );
return new[] {
new CustomPopupPlacement( new Point( -50, targetSize.Height ), PopupPrimaryAxis.Vertical ),
new CustomPopupPlacement( new Point( -50, -popupSize.Height ), PopupPrimaryAxis.Vertical ),
};
}

关于c# - 为什么 WPF Popup PlacementRectangle 会导致裁剪?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22366936/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com