Как открыть элемент меню ContextMenu в левом и правом щелчках как в WPF [дубликат]

Если скрипт, который вы хотите загрузить, находится в том же каталоге, что и тот, который вы запустили, возможно, «импорт» выполнит задание?

Если вам необходимо динамически импортировать код, встроенная функция __ import __ , а модуль imp стоит посмотреть.

>>> import sys
>>> sys.path = ['/path/to/script'] + sys.path
>>> __import__('test')

>>> __import__('test').run()
'Hello world!'

test.py:

def run():
        return "Hello world!"

Если вы используя Python 3.1 или более позднюю версию, вы также должны взглянуть на importlib .

21
задан Relativity 29 November 2010 в 17:05
поделиться

8 ответов

Вот решение XAML. Просто добавьте этот стиль в свою кнопку. Это приведет к тому, что контекстное меню будет открыто как с левого, так и с правого щелчка. Наслаждайтесь!

<Button Content="Open Context Menu">
    <Button.Style>
        <Style TargetType="{x:Type Button}">
            <Style.Triggers>
                <EventTrigger RoutedEvent="Click">
                    <EventTrigger.Actions>
                        <BeginStoryboard>
                            <Storyboard>
                                <BooleanAnimationUsingKeyFrames Storyboard.TargetProperty="ContextMenu.IsOpen">
                                    <DiscreteBooleanKeyFrame KeyTime="0:0:0" Value="True"/>
                                </BooleanAnimationUsingKeyFrames>
                            </Storyboard>
                        </BeginStoryboard>
                    </EventTrigger.Actions>
                </EventTrigger>
            </Style.Triggers>
            <Setter Property="ContextMenu">
                <Setter.Value>
                    <ContextMenu>
                        <MenuItem />
                        <MenuItem />
                    </ContextMenu>
                </Setter.Value>
            </Setter>
        </Style>
    </Button.Style>
</Button>
34
ответ дан Ben Wilde 21 August 2018 в 11:54
поделиться
  • 1
    Не работает свойство net35 – Eugene Strizhok 5 February 2014 в 19:08
  • 2
    Стиль был правильным, однако, когда я добавляю команду в MenuItem, это не вызывает событие. Я проверил - привязки верны. Есть идеи? – utkarsh 14 December 2014 в 09:36
  • 3
    У меня такая же проблема с @utkarsh, когда я пытаюсь привязать команду к MenuItem, <MenuItem Header="Download" Command="{Binding DownloadButtonCommand}"/> он не работает, не советуют? – Kerwen 17 April 2018 в 02:35
  • 4
    Кажется, что привязка данных контекстного меню задается только щелчком правой кнопки мыши. После первого щелчка правой кнопкой мыши он работает также при щелчке левой кнопкой мыши. Вот почему я решил использовать это решение: stackoverflow.com/a/29123964/4550393 – Norman 12 June 2018 в 08:37

вам нужно только добавить код в функцию Image_MouseDown

e.Handled = true;

Тогда он не исчезнет.

3
ответ дан Bruce Wu 21 August 2018 в 11:54
поделиться

вы можете привязать свойство Isopen свойства contextMenu к свойству в вашем представленииModel как «IsContextMenuOpen». но проблема заключается в том, что вы не можете напрямую связать контекстное меню с вашим модулем viewModel, потому что оно не является частью вашего hiarchy userControl. Чтобы разрешить это, вы должны привязать свойство тега к textontext вашего представления.

<Image Tag="{Binding DataContext, ElementName=YourUserControlName}">
<ContextMenu IsOpen="{Binding PlacementTarget.Tag.IsContextMenuOpen,Mode=OneWay}" >
.....
</ContextMenu>
<Image>

Удачи.

0
ответ дан erradi mourad 21 August 2018 в 11:54
поделиться

Вы можете сделать это, используя событие MouseDown для изображения, подобное этому

<Image ... MouseDown="Image_MouseDown">
    <Image.ContextMenu>
        <ContextMenu>
            <MenuItem .../>
            <MenuItem .../>
        </ContextMenu>
    </Image.ContextMenu>
</Image>

. Затем покажите ContextMenu в EventHandler в коде позади

private void Image_MouseDown(object sender, MouseButtonEventArgs e)
{
    if (e.ChangedButton == MouseButton.Left)
    {
        Image image = sender as Image;
        ContextMenu contextMenu = image.ContextMenu;
        contextMenu.PlacementTarget = image;
        contextMenu.IsOpen = true;
    }
}
11
ответ дан Fredrik Hedblad 21 August 2018 в 11:54
поделиться
  • 1
    Эта реализация заставляет контекстное меню появляться и сразу исчезает. Я использую элемент управления и его контекстное меню в DataTemplate, не уверен, что это важно ... – epalm 25 November 2011 в 18:04
  • 2
    это не похоже на событие ContextMenuOpening, поэтому код в зависимости от этого не будет работать. – stijn 16 January 2012 в 23:21
  • 3
    Я вижу то же самое, что epalm – Rhyous 8 October 2012 в 20:19
  • 4
    [Д0] uxpassion.com/blog/old-blog/… – Sonhja 25 February 2013 в 12:03
  • 5
    Просто используйте MouseUp event – VARAK 5 September 2013 в 08:51

Если вы хотите сделать это только в Xaml без использования кода, вы можете использовать поддержку триггеров Expression Blend:

...
xmlns:i="schemas.microsoft.com/expression/2010/interactivity"
...

<Button x:Name="addButton">
    <Button.ContextMenu>
        <ContextMenu ItemsSource="{Binding Items}" />
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="Click">
                <ei:ChangePropertyAction TargetObject="{Binding ContextMenu, ElementName=addButton}" PropertyName="PlacementTarget" Value="{Binding ElementName=addButton, Mode=OneWay}"/>
                <ei:ChangePropertyAction TargetObject="{Binding ContextMenu, ElementName=addButton}" PropertyName="IsOpen" Value="True"/>
            </i:EventTrigger>
        </i:Interaction.Triggers>
    </Button.ContextMenu>
</Button>
0
ответ дан jan 21 August 2018 в 11:54
поделиться
  • 1
    Не могли бы вы указать пространства имен xml в вашем примере? – jan 31 May 2012 в 10:15
  • 2
    XMLNS = & Quot; [д0] schemas.microsoft.com/winfx/2006/xaml/presentation" ; XMLNS: я = & Quot; schemas.microsoft.com/expression/2010/interactivity" ; – Flatliner DOA 13 June 2012 в 00:06
  • 3
    В этом же вопросе epalm упоминается в другом ответе – Rhyous 8 October 2012 в 20:20
  • 4
    Моя проблема с этим ответом заключается в том, что нет полного списка кодов, поэтому & quot; & lt; ContextMenu ItemsSource = & quot; {Binding Items} & quot; / & GT; & Quot; не имеет смысла. Кроме того, если я подключу это в приложение для песочницы, я все равно получаю ошибки с синтаксисом. Я использую .Net4.5, VS2013, так что уверен, что это не так! – Bertie 16 July 2015 в 12:35

Эй, я столкнулся с той же проблемой, ища решение, которое я не нашел здесь.

Я ничего не знаю о MVVM, поэтому, вероятно, это не MVVM, но это сработало для меня.

Шаг 1. Дайте вашему контекстному меню имя.

<Button.ContextMenu>
    <ContextMenu Name="cmTabs"/>
</Button.ContextMenu>

Шаг 2: Дважды щелкните объект управления и вставьте этот код. Вопросы для заказа!

Private Sub Button_Click_1(sender As Object, e As Windows.RoutedEventArgs)
        cmTabs.StaysOpen = True
        cmTabs.IsOpen = True
    End Sub

Шаг 3: Наслаждайтесь

Это будет реагировать на левый и правый; щелкните правой кнопкой мыши. Это кнопка с ImageBrush с ControlTemplate.

0
ответ дан Matthis Kohli 21 August 2018 в 11:54
поделиться

Вы можете придумать свой собственный DependencyProperty, который открывает контекстное меню при щелчке по изображению, например:

  <Image Source="..." local:ClickOpensContextMenuBehavior.Enabled="True">
      <Image.ContextMenu>...
      </Image.ContextMenu>
  </Image>

И вот код C # для этого свойства:

public class ClickOpensContextMenuBehavior
{
  private static readonly DependencyProperty ClickOpensContextMenuProperty =
    DependencyProperty.RegisterAttached(
      "Enabled", typeof(bool), typeof(ClickOpensContextMenuBehavior),
      new PropertyMetadata(new PropertyChangedCallback(HandlePropertyChanged))
    );

  public static bool GetEnabled(DependencyObject obj)
  {
    return (bool)obj.GetValue(ClickOpensContextMenuProperty);
  }

  public static void SetEnabled(DependencyObject obj, bool value)
  {
    obj.SetValue(ClickOpensContextMenuProperty, value);
  }

  private static void HandlePropertyChanged(
    DependencyObject obj, DependencyPropertyChangedEventArgs args)
  {
    if (obj is Image) {
      var image = obj as Image;
      image.MouseLeftButtonDown -= ExecuteMouseDown;
      image.MouseLeftButtonDown += ExecuteMouseDown;
    }

    if (obj is Hyperlink) {
      var hyperlink = obj as Hyperlink;
      hyperlink.Click -= ExecuteClick;
      hyperlink.Click += ExecuteClick;
    }
  }

  private static void ExecuteMouseDown(object sender, MouseEventArgs args)
  {
    DependencyObject obj = sender as DependencyObject;
    bool enabled = (bool)obj.GetValue(ClickOpensContextMenuProperty);
    if (enabled) {
      if (sender is Image) {
        var image = (Image)sender;
        if (image.ContextMenu != null)
          image.ContextMenu.IsOpen = true;
      }
    }
  } 

  private static void ExecuteClick(object sender, RoutedEventArgs args)
  {
    DependencyObject obj = sender as DependencyObject;
    bool enabled = (bool)obj.GetValue(ClickOpensContextMenuProperty);
    if (enabled) {
      if (sender is Hyperlink) {
        var hyperlink = (Hyperlink)sender;
        if(hyperlink.ContextMenu != null)
          hyperlink.ContextMenu.IsOpen = true;
      }
    }
  } 
}
6
ответ дан StillLearnin 21 August 2018 в 11:54
поделиться
  • 1
    Это было очень полезно, но мне нужно было назначить PlacementTarget из ContextMenu обратно в DependencyObject (в моем случае, Button), чтобы меню правильно заполнилось. Это было для динамического контекстного меню, заполненного для каждого элемента в ListView. – Eric P. 30 April 2015 в 22:12

XAML

    <Button x:Name="b" Content="button"  Click="b_Click" >
        <Button.ContextMenu >
            <ContextMenu   >
                <MenuItem Header="Open" Command="{Binding OnOpen}" ></MenuItem>
                <MenuItem Header="Close" Command="{Binding OnClose}"></MenuItem>                    
            </ContextMenu>
        </Button.ContextMenu>
    </Button>

C #

    private void be_Click(object sender, RoutedEventArgs e)
        {
        b.ContextMenu.DataContext = b.DataContext;
        b.ContextMenu.IsOpen = true;            
        }
-1
ответ дан d Koi 21 August 2018 в 11:54
поделиться
  • 1
    OP спрашивает о событии клика на элементе управления изображением. Вы используете решение для управления кнопками. – Noel Widmer 20 May 2015 в 06:15
  • 2
    Это также не следует хорошей практике mvvm. – Josh Menzel 1 December 2015 в 18:21
Другие вопросы по тегам:

Похожие вопросы: