Как определить, с какой стороны открывается ContextMenu?

#wpf

#wpf

Вопрос:

Допустим, я получил это 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?

(извините за мой английский)

Ответ №1:

Попробуйте установить Placement свойство в AbsolutePoint . Также проверьте это, это может вам помочь.