有什么方法可以停止 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/