我有一个简单的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属性)。
这是为什么?我能做些什么呢?
答案 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边框与弹出窗口的宽度相同,从而抵消了对齐问题。