将WPF应用程序移植到在VMware下运行的Windows 8实例(x64)时,我发现所有弹出窗口都与它们应该是的错误对齐。进一步调查显示,即使对于新创建的项目,这也是一个常见的“问题”。 WPF的弹出控件似乎改变了左右的含义!可以通过使用vs 2012创建一个wpf应用程序并在其中放入一些弹出窗口来显示问题,例如:
<Grid Background="Gray">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="129*"/>
<ColumnDefinition Width="264*"/>
<ColumnDefinition Width="124*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="30"/>
<RowDefinition Height="30"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<DockPanel Grid.Row="1" Grid.Column="1" Background="LightGray">
<Popup StaysOpen="True" IsOpen="True" Grid.RowSpan="2" Placement="Right" AllowsTransparency="True" >
<TextBlock Text="Right" Foreground="White" />
</Popup>
<Popup StaysOpen="True" IsOpen="True" Grid.RowSpan="2" Placement="Left" AllowsTransparency="True" >
<TextBlock Text="Left" Foreground="White" />
</Popup>
<Popup StaysOpen="True" IsOpen="True" Grid.RowSpan="2" Placement="Top" AllowsTransparency="True" >
<TextBlock Text="Top" Foreground="White" />
</Popup>
<Popup StaysOpen="True" IsOpen="True" Grid.RowSpan="2" Placement="Bottom" AllowsTransparency="True" >
<TextBlock Text="Bottom" Foreground="White" />
</Popup>
</DockPanel>
</Grid>
应该显示在左侧的弹出窗口实际显示在右侧,反之亦然,应该位于左下角的弹出窗口显示在右下方等。
我的问题是:1)这是一个错误或功能吗? 2)如果它是一个功能,如何对代码进行最小化更改,以便它们在Windows 7和Windows 8中以相同的方式执行?
答案 0 :(得分:17)
进一步调查显示控制面板内有一个设置: ControlPanel-&gt;硬件和声音 - &gt; Tablet PC(节点名称可能不完全匹配,因为我使用的是非英语版本的Windows 8)。有一个用户喜欢用手写的设置。
根据.net框架的手册,必须选择“我更喜欢用左手书写”,以便将弹出窗口置于“正确位置”(不使用上面的解决方案)。这个假设根本不是正确的,至少对于destop应用程序而言!
答案 1 :(得分:4)
我们为此编写了一个快速解决方案,并将代码发布在我之前发布的另一个SO线程中。如果您愿意,此修复程序将从您的应用中删除所有位置问题。
Popup Position with Handedness change
希望这有助于某人!