Windows 8弹出位置

时间:2012-10-17 04:45:51

标签: wpf windows-8

将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中以相同的方式执行?

2 个答案:

答案 0 :(得分:17)

进一步调查显示控制面板内有一个设置: ControlPanel-&gt;硬件和声音 - &gt; Tablet PC(节点名称可能不完全匹配,因为我使用的是非英语版本的Windows 8)。有一个用户喜欢用手写的设置。

根据.net框架的手册,必须选择“我更喜欢用左手书写”,以便将弹出窗口置于“正确位置”(不使用上面的解决方案)。这个假设根本不是正确的,至少对于destop应用程序而言!

答案 1 :(得分:4)

我们为此编写了一个快速解决方案,并将代码发布在我之前发布的另一个SO线程中。如果您愿意,此修复程序将从您的应用中删除所有位置问题。

Popup Position with Handedness change

希望这有助于某人!