Если скрипт, который вы хотите загрузить, находится в том же каталоге, что и тот, который вы запустили, возможно, «импорт» выполнит задание?
Если вам необходимо динамически импортировать код, встроенная функция __ 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 .
Вот решение 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>
вам нужно только добавить код в функцию Image_MouseDown
e.Handled = true;
Тогда он не исчезнет.
вы можете привязать свойство Isopen свойства contextMenu к свойству в вашем представленииModel как «IsContextMenuOpen». но проблема заключается в том, что вы не можете напрямую связать контекстное меню с вашим модулем viewModel, потому что оно не является частью вашего hiarchy userControl. Чтобы разрешить это, вы должны привязать свойство тега к textontext вашего представления.
<Image Tag="{Binding DataContext, ElementName=YourUserControlName}">
<ContextMenu IsOpen="{Binding PlacementTarget.Tag.IsContextMenuOpen,Mode=OneWay}" >
.....
</ContextMenu>
<Image>
Удачи.
Вы можете сделать это, используя событие 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;
}
}
Если вы хотите сделать это только в 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>
Эй, я столкнулся с той же проблемой, ища решение, которое я не нашел здесь.
Я ничего не знаю о 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.
Вы можете придумать свой собственный 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;
}
}
}
}
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;
}
<MenuItem Header="Download" Command="{Binding DownloadButtonCommand}"/>
он не работает, не советуют? – Kerwen 17 April 2018 в 02:35