【问题标题】:Unable to use resource defined in resourcedictionary in code无法在代码中使用资源字典中定义的资源
【发布时间】:2012-06-17 14:47:08
【问题描述】:

我的问题如下:

<phone:PhoneApplicationPage.Resources>
    <toolkit:MenuItem Header="edit" x:Key="mnuEdit" x:Name="mnuEdit" Click="mnuEdit_Click" />
</phone:PhoneApplicationPage.Resources> 

我正在尝试将此菜单项添加到代码中的上下文菜单中,代码为ctxmnuList.Items.Add(this.Resources["mnuEdit"] as MenuItem);

但在运行时我收到InvalidOperationException 错误消息为Element is already the child of another element.

请帮助解决这个问题。我正在搜索过去 2 天的解决方案。 任何帮助将不胜感激

还是谢谢z

【问题讨论】:

  • 显而易见的问题:您可以将MenuItem 定义为ctxmnuList 的一部分而不是作为资源吗?您打算将此资源添加到多个元素还是仅添加到一个元素?
  • 实际上......我的要求就像我无法创建静态上下文菜单。由于一些性能问题(在页面构造函数中创建了许多 contextmenuitem 对象),我想在页面资源字典中定义它们以获取一些 UI 性能。此外,这在应用程序栏图标按钮和菜单项上对我有用。我需要根据用户选择的内容和屏幕上的默认值动态加载它们。我已经在页面的资源字典中定义了它们,并且确实获得了巨大的 ui 性能。

标签: c# windows-phone-7 windows-phone-7.1 silverlight-toolkit


【解决方案1】:

这应该对你有用:

var mnuEdit = (MenuItem)this.Resources["mnuEdit"];
this.Resources.Remove(mnuEdit);
ctxmnuList.Items.Add(mnuEdit);

【讨论】:

  • 在同一个PhoneApplicationPage实例中,会失败。在新实例中,它将起作用(this.Resources 不是静态的)。您是否在同一实例中多次需要它?如果是这样,为什么?如果您每次通过右键单击请求上下文菜单时都尝试创建它,那么您可能从错误的角度执行此操作,您可能希望保留 ctxmnuList,或者将 mnuEdit 更改为模板、样式、或 UserControl,然后在您想要生成上下文菜单时简单地应用该模板。或者只是将 mnuEdit 保留在一个字段中,并在卸载时将其从 ctxmnuList 中删除
  • 但是你认为,codeplex 的 Phone Tooljit 中定义的 menuitem 类可以自定义 XAML 方式吗?
  • 是的,看起来可以。我的建议都不要求您以编程方式而不是通过 XAML 设置其属性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-08
  • 2011-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多