2015-04-04 40 views
0

當我的應用程序在不同的計算機上運行時,彈出控件的放置位置不一致。我將「展示位置」設置爲「絕對點」,並體驗彈出窗口在兩臺計算機上對齊到彈出窗口的右上角,但彈出窗口在其他一臺計算機的左上角(在每臺計算機上運行相同的應用程序時)。當Placement = AbsolutePoint時,WPF Popup的對齊點不一致(右上或左上)

我使用Horizo​​ntalOffset和VerticalOffset依賴項屬性(相對於屏幕的左上角座標)定位彈出窗口。

文檔(https://msdn.microsoft.com/en-us/library/bb613596%28v=vs.110%29.aspx)顯示彈出對齊點應位於彈出窗口的左上角,目標區域是整個屏幕(並且目標原點位於屏幕的左上角)。

認爲它可能是.Net框架的變化或顯示縮放因素的差異(不太可能,但仍然),我收集了以下信息,但我看不到這種行爲的明顯原因;

其中彈出對準的一點是要彈出的右上角的計算機是: 1).Net框架4.5.1和的125% 2).Net框架4.5.2縮放因子爲100%

縮放因子

彈出對齊點位於彈出窗口左上角的計算機是: 1).Net Framework 4.5.2具有未知縮放因子(我需要訪問它才能再次檢查)。

任何想法爲什麼配置不一致?這與屏幕的邊界無關 - 彈出不在任何邊緣附近。

+1

您可以感謝微軟:http://stackoverflow.com/questions/4043878/why-is-my-popup-showing-opposite-the-placement-property-on-some-machines – 2015-07-03 12:30:14

+0

這是屬性螺絲所有東西:https://msdn.microsoft.com/en-us/library/system.windows.systemparameters.menudropalignment.aspx – 2015-07-03 12:30:29

回答

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邊框與彈出框的寬度相同,因此消除了對齊問題。