为什么我的Popup在某些机器上显示与Placement属性相反?

时间:2010-10-28 14:30:29

标签: wpf popup

我有一个简单的WPF Popup,我在用户点击Button时显示。

<Button
    x:Name="aButton"
    Content="Up/Down"
    Width="75"
    Height="30"
    Click="aButton_Click"
/>
<Popup
    PlacementTarget="{Binding ElementName=aButton}"
    Placement="Right"
    VerticalOffset="-31"
    StaysOpen="False"
    AllowsTransparency="True"
>
    <StackPanel>
        <Button Width="45" Height="45" Margin="2,0,2,2" Content="+"/>
        <Button Width="45" Height="45" Margin="2,0,2,0" Content="-"/>
    </StackPanel>
</Popup>

极为奇怪的是......这段代码的运行方式不同,具体取决于它运行的机器。

我在我的主桌面上运行此代码,一切正常......并且应该如此。我在我的PDC09上网本上运行它...并且Popup显示在相反的位置(左侧而不是右边,因为我告诉它使用Placement属性)。

这是为什么?我能做些什么呢?

2 个答案:

答案 0 :(得分:12)

我无法通过Google找到任何内容...但是WPF forum中的幸运搜索很快找到了post自我注意:如果Google无法找到任何内容,请不要忘记搜索WPF论坛。

答案是我的PDC09上网本是一款平板电脑,显然,微软认为在平板电脑上显示Popup与Placement属性相反是一个好主意。这样弹出窗口就不会出现在用户手下。

解决方案是恢复自定义弹出式展示位置...如果您不想要此行为。

我很想知道解决这个问题的其他方法。

答案 1 :(得分:1)

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

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