Как отмечает Андрей, это поведение глубоко внутри элемента управления 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
позволили это сделать.
Это должно быть расширено, чтобы охватить все четыре края экрана и возможность использования нескольких экранов, но это демонстрирует, что подход является работоспособным.