繁体   English   中英

WPF Popup的对齐点与Placement = AbsolutePoint不一致(右上或左上)

[英]WPF Popup's alignment point inconsistent (top right, or top left) with Placement=AbsolutePoint

当我的应用程序在其他计算机上运行时,我看到弹出控件的位置不一致。 我将Placement设置为AbsolutePoint,并体验到弹出式窗口与两台计算机上弹出窗口的右上角对齐,但与另一台计算机上的弹出窗口左上角对齐(在每台计算机上运行相同的应用程序时)。

我正在使用Horizo​​ntalOffset和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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM