![](/img/trans.png)
[英]How to get the Left,Top,Right,Bottom point of a UIElement in WPF?
[英]WPF Popup's alignment point inconsistent (top right, or top left) with Placement=AbsolutePoint
当我的应用程序在其他计算机上运行时,我看到弹出控件的位置不一致。 我将Placement设置为AbsolutePoint,并体验到弹出式窗口与两台计算机上弹出窗口的右上角对齐,但与另一台计算机上的弹出窗口左上角对齐(在每台计算机上运行相同的应用程序时)。
我正在使用HorizontalOffset和VerticalOffset依赖项属性(相对于屏幕的左上角坐标)定位弹出窗口。
该文档( https://msdn.microsoft.com/zh-cn/library/bb613596%28v=vs.110%29.aspx )显示,弹出对齐点应位于弹出窗口的左上方,并带有目标区域是整个屏幕(因此目标原点在屏幕的左上方)。
考虑到可能是.Net框架中的更改或显示比例因子的不同(不太可能,但仍然如此),我收集了以下信息,但我看不出出现此现象的明显原因;
弹出窗口对齐点位于弹出窗口右上角的计算机是:1).Net Framework 4.5.1,缩放比例为125%2).Net Framework 4.5.2,缩放比例为100%
弹出窗口对齐点位于弹出窗口左上角的计算机是:1)。Net Framework 4.5.2,缩放比例未知(我需要访问它才能再次检查)。
有什么想法为什么放置不一致? 这与屏幕的边界无关-弹出窗口不靠近任何边缘。
我通过在与所需放置目标相同的网格行/行中添加边框来解决此问题。 然后将其设置为放置目标。 通过将此边框的宽度绑定到弹出内容,它将自动调整其宽度,因此对齐方式(左或右)无关紧要。 如果仍要控制对齐,则可以通过对齐放置目标边框来实现。 希望这是有道理的,如果不是这样,请举一个简单的例子。
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Popup x:Name="StartMenuPopup" Placement="Top" PlacementTarget="{Binding ElementName=PopupTarget}" >
<Border x:Name="PopupBorder">
</Border>
</Popup>
<Border x:Name="PopupTarget" Grid.Row="1" Width="{Binding ActualWidth, Mode=OneWay, ElementName=PopupBorder}"
BorderThickness="0" HorizontalAlignment="Left" VerticalAlignment="Top"/>
<startmenu:TaskBar Grid.Row="1">
<startmenu:TaskBar.StartButton>
<startmenu:ToggleMenu Width="36" x:Name="StartButton"
ImageData="{Binding StartButtonImageData}"
AssociatedPopup="{Binding ElementName=StartMenuPopup}"
IsOpen="{Binding StartMenuOpen, Mode=TwoWay}"/>
</startmenu:TaskBar.StartButton>
</startmenu:TaskBar>
</Grid>
弹出窗口PlacementTarget绑定到PopupTarget边界,而PopupTarget边界宽度绑定回到PopupBorder元素。 这使得PopupTarget边框的宽度与弹出窗口相同,因此消除了对齐问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.