ContextMenu działające na lewy klik

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...

0

W międzyczasie zaimplementowałam jeszcze to rozwiązanie: https://stackoverflow.com/questions/555252/show-contextmenu-on-left-click-using-only-xaml/29123964#29123964
Ale działa dokładnie tak samo...

1

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!

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