ContextMenu działające na lewy klik

Odpowiedz Nowy wątek
2019-12-02 10:28
Moderator

Rejestracja: 10 lat temu

Ostatnio: 3 minuty temu

0

Kombinuję jak by tu sprawić, by ContextMenu pojawiało się pod lewym klikiem. Pod prawym też może być, a może nie być, bez różnicy - ważne, by pojawiło się pod lewym.
Nakreślmy kontekst: używam MVVM Light, jestem w CustomTaskPane, w którym wyświetla się ListView, którego Itemy to DataTemplate. Taki Item właśnie ma mieć ContextMenu. Item nie ma pliku cs z code behind, tylko odwołuje się do view-modelu TaskPane'a przez RelayCommands. Dlatego najchętniej skłaniam się ku rozwiązaniom, które można zaimplementować w xamlu.

Mniej więcej działa mi to:

<ToggleButton Name="OptionsButton" 
              Padding="0" 
              Margin="0"
              Height="25"
              Width="100"
              DataContext="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path=DataContext}"
              Style="{StaticResource DefaultToggleButton}"
              ContextMenuService.Placement="Bottom"
              ContextMenuService.PlacementTarget="{Binding ElementName=OptionsButton}"
              ContextMenuService.ShowOnDisabled="True">
    <ToggleButton.Resources>
        <DiscreteObjectKeyFrame x:Key="optionsProxy" Value="{Binding ElementName=OptionsButton}"/>
    </ToggleButton.Resources>
    <ToggleButton.ContextMenu>
        <ContextMenu IsOpen="{Binding Path=Value.IsChecked, Source={StaticResource optionsProxy}, Mode=TwoWay}">

Zachowanie na kliki jest OK. Niestety jednak nie wygląda to dobrze... Na lewy klik nie ładują się style, które mam w osobnym pliku. Jeśli kliknę prawym, to wygląda dobrze i następne kliknięcia lewym też już są OK, ale jeśli klikałabym tylko lewym, to mam domyślne style. Style są dodane o tak:

    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="../../Resources/Styles/MenuStyle.xaml" />
    </ResourceDictionary.MergedDictionaries>

Drugi problem to pozycja menu. Jak widac, mam tu ustawiony ContextMenuService.PlacementTarget i ContextMenuService.Placement. Jeśli używam prawego klika, to menu ładnie usadawia się pod przyciskiem. Jeśli klikam lewym, to menu pojawia się w miejscu kliknięcia...

Pozostało 580 znaków

2019-12-02 10:36
Moderator

Rejestracja: 10 lat temu

Ostatnio: 3 minuty temu

0

W międzyczasie zaimplementowałam jeszcze to rozwiązanie: https://stackoverflow.com/que[...]g-only-xaml/29123964#29123964
Ale działa dokładnie tak samo...

Pozostało 580 znaków

2019-12-02 10:40
Moderator

Rejestracja: 10 lat temu

Ostatnio: 3 minuty temu

Do rozwiązania wyżej dodałam dwie linijki i pięknie działa :D

        private static void OnMouseLeftButtonUp(object sender, RoutedEventArgs e)
        {            
            var fe = sender as FrameworkElement;
            if (fe != null)
            {
                // if we use binding in our context menu, then it's DataContext won't be set when we show the menu on left click
                // (it seems setting DataContext for ContextMenu is hardcoded in WPF when user right clicks on a control, although I'm not sure)
                // so we have to set up ContextMenu.DataContext manually here
                if (fe.ContextMenu.DataContext == null)
                {
                    fe.ContextMenu.SetBinding(FrameworkElement.DataContextProperty, new Binding { Source = fe.DataContext });
                }
                fe.ContextMenu.PlacementTarget = fe;
                fe.ContextMenu.Placement = PlacementMode.Bottom;
                fe.ContextMenu.IsOpen = true;
            }
        }

Jak zwykle napisanie na 4programmers pomogło rozwiązać problem ;) Dzięki!

Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0