0

我怎样才能获得相关的访问权限MenuItem?它是动态创建的,所以我不能只通过 xaml 文件中的名称使用它。

private void menuItem_canExecute(object sender, CanExecuteRoutedEventArgs e)
{
    var snd = sender; // This is the main window
    var orgSource = e.OriginalSource; // This is a RichTextBox;
    var src = e.Source; // This is a UserControl

    // I think I must use the Command, but how?
    RoutedCommand routedCommand = e.Command as RoutedCommand;
}
4

2 回答 2

1

CanExecuteRoutedEventArgs有财产OriginalSource

CanExecuteRoutedEventArgs 的 MSDN 文档

OriginalSender可能会是“TextBlock内部”的MenuItem. 您可能需要遍历可视化树才能找到parent类型MenuItem

示例代码来自这里

public static T GetVisualParent<T>(this DependencyObject child) where T : Visual
{
    //TODO wrap this in a loop to keep climbing the tree till the correct type is found 
    //or till we reach the end and haven't found the type
    Visual parentObject = VisualTreeHelper.GetParent(child) as Visual;
    if (parentObject == null) return null;
    return parentObject is T ? parentObject as T : GetVisualParent<T>(parentObject);
}

像这样使用

var menuItem = e.OriginalSource.GetVisualParent<MenuItem>();
if (menuItem != null)
    //Do something....
于 2016-01-16T15:00:08.100 回答
1

您始终可以通过将自身绑定到其CommandParameter属性来将命令 UI 元素传递给命令,例如

<MenuItem ... CommandParameter="{Binding RelativeSource={RelativeSource Self}}"/>

现在您可以通过ParameterCanExecuteRoutedEventArgs 的属性访问 MenuItem:

private void menuItem_canExecute(object sender, CanExecuteRoutedEventArgs e)
{
    var menuItem = e.Parameter as MenuItem;
    ...
}
于 2016-01-17T09:23:00.473 回答