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

时间:2015-04-04 15:40:35

标签: c# wpf popup alignment

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

我使用相对于屏幕左上角坐标的Horizo​​ntalOffset和VerticalOffset依赖项属性来定位弹出窗口。

文档(https://msdn.microsoft.com/en-us/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,具有未知的缩放因子(我需要访问它才能再次检查)。

任何有关展示位置不一致的想法?这与屏幕的边界无关 - 弹出窗口不在任何边缘附近。

1 个答案:

答案 0 :(得分:0)

我通过在与所需放置目标相同的网格列/行中添加边框来解决此问题。然后将其设置为放置目标。通过将此边框的宽度绑定到弹出内容,它将自动调整其宽度,因此对齐(左或右)无关紧要。如果您仍希望控制对齐,可以通过对齐放置目标边框来实现。希望有意义,如果没有,这是一个简单的例子。

<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边框与弹出窗口的宽度相同,从而抵消了对齐问题。