在WPF应用程序中,有一个Grid包含许多对象(它们来自自定义控件).我想使用上下文菜单对每个操作执行一些操作:
<Grid.ContextMenu>
<ContextMenu>
<MenuItem Name="EditStatusCm" Header="Change status" Click="EditStatusCm_Click"/>
</ContextMenu>
</Grid.ContextMenu>
Run Code Online (Sandbox Code Playgroud)
但是在事件处理程序中,我无法知道哪些对象被右键单击:
private void EditStatusCm_Click(object sender, RoutedEventArgs e)
{
MyCustControl SCurrent = new MyCustControl();
MenuItem menu = sender as MenuItem;
SCurrent = menu.DataContext as MyCustControl; // here I get a run-time error
SCurrent.Status = MyCustControl.Status.Sixth;
}
Run Code Online (Sandbox Code Playgroud)
在该注释行上调试器说:对象引用未设置为对象的实例.
请帮忙,我的代码有什么问题?
编辑(补充):
我尝试使用Command方法做同样的事情:
我宣布了一个DataCommands类,RoutedUICommand Requery然后使用Window.CommandBindings
<Window.CommandBindings>
<CommandBinding Command="MyNamespace:DataCommands.Requery" Executed="RequeryCommand_Executed"></CommandBinding>
</Window.CommandBindings>
Run Code Online (Sandbox Code Playgroud)
MenuItem的XAML现在看起来像:
<Grid.ContextMenu>
<ContextMenu>
<MenuItem Name="EditStatusCm" Header="Change status" Command="MyNamespace:DataCommands.Requery"/>
</ContextMenu>
</Grid.ContextMenu>
Run Code Online (Sandbox Code Playgroud)
事件处理程序如下所示:
private void RequeryCommand_Executed(object …Run Code Online (Sandbox Code Playgroud) 我正在尝试将ContextMenu添加到WPF中ListBox中的项目;
<ListBox.ItemTemplate>
<DataTemplate>
<Border>
<Grid>
<Grid.ContextMenu>
<ContextMenu>
<MenuItem Header = "Menu item 1"/>
<MenuItem Header = "Menu item 2"/>
<MenuItem Header = "Menu item 3"/>
</ContextMenu>
</Grid.ContextMenu>
........
........
</Grid>
</Border>
</DataTemplate>
</ListBox.ItemTemplate>
Run Code Online (Sandbox Code Playgroud)
问题是ContextMenu只会在点击网格的实际上下文时打开,我希望能够通过单击列表框项目上的任意位置来打开菜单.
我应该将Grid包装在其他控件中吗?
对于我的应用程序,我在Qt Designer中创建了一个GUI并将其转换为python(2.6)代码.
在一些QPushButton(使用设计器创建)我想添加一个右键单击上下文菜单.菜单选项取决于应用程序状态.
如何实现这样的上下文菜单?
每当我右键单击文件或文件夹时,我想在Finder的上下文菜单中添加一个项目,并且此菜单链接到我的Cocoa应用程序的方法.
我正在关注CocoaDev的示例和Apple的文档,但我无法显示该服务.
这是我的.h
#import <Cocoa/Cocoa.h>
@interface AppDelegate : NSObject <NSApplicationDelegate,NSObject>
@property (assign) IBOutlet NSWindow *window;
-(void)IClicked:(NSPasteboard *)pboard
userData:(NSString *)data
error:(NSString **)error;
@end
Run Code Online (Sandbox Code Playgroud)
.M
#import "AppDelegate.h"
@implementation AppDelegate
@synthesize window = _window;
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
[NSApp setServicesProvider:self];
}
- (void)IClicked:(NSPasteboard *)pboard userData:(NSString *)data error:(NSString **)error
{
NSLog(@"I clicked");
}
@end
Run Code Online (Sandbox Code Playgroud)
和我的Application-plist.info的摘录:
<key>NSServices</key>
<array>
<dict>
<key>NSKeyEquivalent</key>
<dict>
<key>default</key>
<string>E</string>
</dict>
<key>NSMenuItem</key>
<dict>
<key>default</key>
<string>My Application</string>
</dict>
<key>NSMessage</key>
<string>IClicked</string>
<key>NSPortName</key>
<string>TestService</string>
<key>NSSendFileTypes</key>
<array>
<string>public.item</string>
</array>
<key>NSSendTypes</key>
<array>
<string>NSPasteboardTypeString</string>
</array>
<key>NSRequiredContext</key>
<dict>
<key>NSServiceCategory</key> …Run Code Online (Sandbox Code Playgroud) 当您右键单击Delphi表单时,您将获得弹出上下文菜单.底部选项是Text DFM.可以选中或不选中此选项.选中或取消选中此选项时的含义是什么?

我安装了随ArcGIS 10.2.2安装的Python 2.7.5.当我第一次右键单击我之前编写的.py脚本时,它在上下文菜单中列出了"使用IDLE编辑"选项.但是,当我右键单击.py文件时,不再显示此选项.
我已经阅读了很多关于这个问题的线程,并尝试了其中的一些,例如修改/删除注册表项,然后重新安装/修复软件.我现在对使用IDE不感兴趣,尽管很多人会很高兴知道我打算稍后使用IDE.现在,目的是解决问题,而不是避免和解决它.
我感谢我过去从在线社区获得的帮助,我相信有人会为我找到解决方案.
如何在上下文菜单中返回"使用IDLE编辑"?
我在Google Chrome中创建了一个上下文菜单项,如下所示:
chrome.contextMenus.create({
"title":"My Context Menu Item",
"contexts":["editable"],
"onclick": onClick
});
Run Code Online (Sandbox Code Playgroud)
该onClick回调接收两个参数:一个OnClickInfo对象和一个标签对象.这两个对象似乎都不包含对调用上下文菜单时右键单击的DOM元素的引用.我有console.logged这两个对象但在任何地方都没有看到对目标元素的任何引用.
期望的结果:
onClick回调中,让我的扩展名搜索相对于目标右键单击元素的父"form"元素就目前而言,它看起来并不像Chrome提供对目标元素的任何引用.有没有人找到解决这个限制的方法?
我想将contextmenu绑定到命令列表.
<Grid.ContextMenu>
<ContextMenu ItemsSource="{Binding ItemContextCommands, Converter={StaticResource commandToStringConverter}}">
<ContextMenu.ItemTemplate >
<DataTemplate DataType="MenuItem">
<MenuItem Command="{Binding}"></MenuItem>
</DataTemplate>
</ContextMenu.ItemTemplate>
</ContextMenu>
</Grid.ContextMenu>
Run Code Online (Sandbox Code Playgroud)
在commandToStringConverter简单的命令列表转换为字符串调用列表ToString()列表中的每个命令.
我怎样才能实现Command每个MenuItem被称为?
我在这里有一个项目,我需要在我的WPF应用程序中自定义上下文菜单,其中一个按钮将放置在所有菜单项的底部.
但是,如果我要通过XAML添加按钮,它将在上下文菜单中显示为集合中的另一个项目,并且鼠标悬停突出显示将对其起作用.
我希望将上下文菜单调整为类似网格的样式,以便我可以自定义它下面的样式.
知道如何实现这一目标(最好是在XAML中)?
我试过寻找解决方案,但没有发现任何符合我情况的解决方案.我有一个MainActivity,它扩展了FragmentActivity和多个ListFragments.我使用PagerSlidingTabStrip库作为slidetabs和一个ViewPager.片段没有XML布局,它们只是ListFragments,它返回ListView,因此不需要布局.
它是一个音板应用程序,长按一个列表项,允许用户将声音文件设置为铃声,通知或警报,或保存到SD卡.
现在,所有片段加载自己的数据就好了.一切似乎都没问题,但是,当我在后台加载的Fragment上使用上下文菜单时,似乎是使用了在它之前加载的第一个或前一个片段中的ListView,它是在创建它时可见的.
我的意思是,说我的MainActivity开始,它加载FragmentA,并在后台FragmentB也被预加载.
在onActivityCreated方法中,对于两个Fragments,它使用registerForContextMenu(getListView()).
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
// Data loading etc
MyAdapter adapter = new MyAdapter(getActivity(),
R.layout.data_row, data);
setListAdapter(adapter);
registerForContextMenu(getListView());
}
Run Code Online (Sandbox Code Playgroud)
但似乎正在发生的事情是FragmentB调用了registerForContextMenu(getListView()),它似乎采用了当前活动的ListView,这是FragmentA的列表.
所以,假设我选择从上下文菜单中保存文件.我长按了FragmentB的第一项,但它试图保存FragmentA的第一项.如果我只是点击列表项,它会像您期望的那样播放它自己的声音,但是上下文菜单命令使用预加载时可见的片段列表.
这是onCreateContextMenu.注意,此时它使用上下文菜单Title中的正确项Title.
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo)menuInfo;
menu.setHeaderTitle(data.get(info.position).getDataName());
MenuInflater inflater = this.getActivity().getMenuInflater();
inflater.inflate(R.menu.context_menu, menu);
}
Run Code Online (Sandbox Code Playgroud)
这是onContextItemSelected.
@Override
public boolean onContextItemSelected(MenuItem item) {
AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
int dataID = data.get(info.position).getDataID();
String dataName = data.get(info.position).getDataName();
Activity activity = getActivity();
if(activity instanceof …Run Code Online (Sandbox Code Playgroud)