假设我有这个ContextMenu:
<Style x:Key="{x:Type ContextMenu}" TargetType="{x:Type ContextMenu}">
<Setter Property="VerticalOffset" Value="-10"/>
<Setter Property="HorizontalOffset" Value="-10"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ContextMenu}">
<Border Background="Transparent">
<Border.Effect>
<DropShadowEffect BlurRadius="10" ShadowDepth="0" Opacity="0.5"/>
</Border.Effect>
<Border Margin="10" Style="{StaticResource MenuBorderStyle}">
<Grid x:Name="SubMenu" Grid.IsSharedSizeScope="True">
<!-- StackPanel holds children of the menu. This is set by IsItemsHost=True -->
<StackPanel IsItemsHost="True" KeyboardNavigation.DirectionalNavigation="Cycle"/>
</Grid>
</Border>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
正如您所看到的,我将菜单的外观偏移了10个像素到顶部和左侧,使ContextMenu
的左上角位于光标下方。
事实上,由于Border
的10像素边距,整个控件应该比光标更左上角,因为它自己以阴影开始的控制。
而且,正如您可能已经猜到的那样,当上下文菜单不在光标的右下方(比如光标位于屏幕的底部或左侧)时,需要将偏移更改为相反的(通过X或Y或两者坐标)。
问题是如何通过xaml做到这一点?
(对不起我的英文)