c# - 有什么方法可以阻止 WPF Popup 在离开屏幕时重新定位自身?

标签 c# wpf popup multiple-monitors

有什么方法可以停止 WPF Popup当它离开屏幕时重新定位自己?

我找到了这个 old question , 但它没有得到正确的答案。有什么办法吗?如有必要,我愿意将其子类化。谢谢。

最佳答案

正如 Andrei 所指出的,这种行为在 Popup 控件的深处,很难克服。如果您愿意做一些工作,可以通过在弹出窗口到达屏幕边缘时调整大小和翻译弹出窗口的内容来完成。出于演示目的,我们将关注屏幕的左边缘。

如果我们有这样的 XAML:

<Window ...
        LocationChanged="Window_LocationChanged"
        SizeChanged="Window_SizeChanged"
        >
    <Grid>
        <Rectangle Name="rectangle1" Width="100" Height="100" Fill="Blue"/>
        <Popup Name="popup1" PlacementTarget="{Binding ElementName=rectangle1}" IsOpen="True" Width="100" Height="100">
            <TextBlock Background="White" TextWrapping="Wrap" Width="100" Height="100">
                <TextBlock.Text>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</TextBlock.Text>
            </TextBlock>
        </Popup>
    </Grid>
</Window>

和这样的代码隐藏:

private void Window_LocationChanged(object sender, EventArgs e)
{
    RefreshPopupPosition();
}

private void Window_SizeChanged(object sender, SizeChangedEventArgs e)
{
    RefreshPopupPosition();
}

private void RefreshPopupPosition()
{
    var upperLeft = rectangle1.PointToScreen(new Point(0, 100));
    var xOffset = Math.Min(0, upperLeft.X);
    popup1.Width = xOffset + 100;
    (popup1.Child as FrameworkElement).Margin = new Thickness(xOffset, 0, 0, 0);
    popup1.HorizontalOffset += 1;
    popup1.HorizontalOffset -= 1;
}

然后通过计算 Popup 将在屏幕外,我们可以减少内容的宽度并给它一个负边距,这样屏幕上的部分就会被裁剪到如果 Popup 允许这样做,就会出现。

这必须扩展以处理屏幕的所有四个边缘和多个屏幕的可能性,但它表明该方法是可行的。

关于c# - 有什么方法可以阻止 WPF Popup 在离开屏幕时重新定位自身?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4632316/

相关文章:

c# - WPF 如何从 DataTemplate 访问控件

WPF Scrollviewer PanningMode移动窗口?

wpf - 使用WinDbg分析WPF应用程序中OutOfMemoryException的根本原因

javascript - 有没有办法确定 <select> 下拉菜单是否打开?

swift | UIViewController 不显示为弹出窗口而是全屏显示

c# - C#中整数类型的最小值和最大值

c# - 在 systemd 文件中使用 Environment= 解析 ASP.NET Core 连接字符串

javascript - 浏览图像并将其传递给弹出窗口

c# - CheckedListBox 和带有索引的选中项目列表

c# - 为依赖于外部库/sdks 的类编写单元测试