Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将菜单项绑定到silverlight中的ContextMenu,包括图标_Silverlight_Xaml_Icons_Contextmenu_Itemssource - Fatal编程技术网

如何将菜单项绑定到silverlight中的ContextMenu,包括图标

如何将菜单项绑定到silverlight中的ContextMenu,包括图标,silverlight,xaml,icons,contextmenu,itemssource,Silverlight,Xaml,Icons,Contextmenu,Itemssource,我有一个上下文菜单,我希望它的菜单项通过绑定填充。 下面的代码可以工作 <Button> <controlsInputToolkit:ContextMenuService.ContextMenu> <controlsInputToolkit:ContextMenu ItemsSource="{Binding MenuItems}"> <controlsInputToolkit:ContextMenu.Ite

我有一个上下文菜单,我希望它的菜单项通过绑定填充。 下面的代码可以工作

<Button>
    <controlsInputToolkit:ContextMenuService.ContextMenu>
        <controlsInputToolkit:ContextMenu ItemsSource="{Binding MenuItems}">
            <controlsInputToolkit:ContextMenu.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Name}" />
                </DataTemplate>
            </controlsInputToolkit:ContextMenu.ItemTemplate>
        </controlsInputToolkit:ContextMenu>
    </controlsInputToolkit:ContextMenuService.ContextMenu>
</Button>

但是有一个问题,ItemTemplate代表菜单项的文本区域,据我所知,它不允许您设置图标

因此,我尝试通过ItemContainerStyle进行绑定,如下例所示

<Button>
    <controlsInputToolkit:ContextMenuService.ContextMenu>
        <controlsInputToolkit:ContextMenu ItemsSource="{Binding MenuItems}">
            <controlsInputToolkit:ContextMenu.ItemContainerStyle>
                <Style TargetType="controlsInputToolkit:MenuItem">
                    <Setter Property="Header" Value="{Binding Name}"/>
                </Style>
            </controlsInputToolkit:ContextMenu.ItemContainerStyle>
        </controlsInputToolkit:ContextMenu>
    </controlsInputToolkit:ContextMenuService.ContextMenu>
</Button>

但是silverlight似乎不喜欢这样


有什么想法吗?

我创建了一个上下文菜单,并将内容设置为MenuItem.Header属性对于图像来说似乎效果不错。有很多设置文本的方法。

我创建了一个上下文菜单,并将内容设置为MenuItem.Header属性似乎对图像很有效。有许多文本设置。

请尝试使用此开源菜单:

该模板允许直接绑定图像。
希望这有帮助。

尝试使用此开源菜单:

该模板允许直接绑定图像。
希望这能有所帮助。

我也有同样的问题,虽然我没有找到我想要的答案,但我找到了一个很好地满足我需要的解决方法。我想你可能会喜欢看它,即使是在事实发生这么久之后

如果
ContextMenu
类的
ItemsSource
包含
MenuItem
对象,则图标会很好地落在它所属的位置。一、 和您一样,我使用的是视图模型,不知道如何将UI逻辑注入到我的视图模型类中

我所做的是实现一个值转换器,将视图模型转换为
MenuItem
对象。看起来有点像这样:


XAML:

<UserControl.Resources>
    <local:DelegatedValueConverter
        x:Key="LocalContextItemConverter"
        Converting="OnBindingContextMenu" />
</UserControl.Resources>

...

<toolkit:ContextMenu
    ItemsSource="{Binding ContextMenuItems, Converter={StaticResource LocalContextItemConverter}}" />

...

C#代码隐藏

private void OnBindingContextMenu(object sender, ValueConvertingEventArgs e)
{
    var dataitems = e.Value as IEnumerable< NavigationItemViewModel >;
    if (dataitems != null)
    {
        var items = dataitems.Select(data => new MenuItem()
        {
            Header = data.Title,
            Icon = data.Icon,
            Tag = data
        }).ToList();
        var handler = new RoutedEventHandler(this.OnContextMenuClick);
        items.ForEach(item => item.Click += handler);
        e.Result = items
    }
}

private void OnContextMenuClick(object sender, RoutedEventArgs e)
{
}
private void OnBindingContextMenu(对象发送者,ValueConvertingEventArgs e)
{
var dataitems=e.值为IEnumerable;
如果(数据项!=null)
{
var items=dataitems.Select(data=>newmenuitem()
{
Header=data.Title,
Icon=data.Icon,
标记=数据
}).ToList();
var handler=newroutedEventHandler(this.OnContextMenuClick);
items.ForEach(item=>item.Click+=handler);
e、 结果=项目
}
}
私有void OnContextMenuClick(对象发送方,RoutedEventArgs e)
{
}

讨论

DelegatedValueConverter
是我详细描述的一点东西,但它并不重要。您可以使用自己的值转换器来代替它

我的视图模型的
Title
属性是一个字符串,
Icon
Image
的一个实例。我使用菜单项的
标记
属性保留对视图模型的引用,以便在单击事件期间可以引用其中的非可视数据

这个解决方案很方便,因为它仍然在UI和视图模型之间提供了一些分离,尽管在本例中我更喜欢纯声明性的解决方案


我希望这有帮助

我也有同样的问题,虽然我没有找到我想要的答案,但我找到了一个很好地满足我需要的解决办法。我想你可能会喜欢看它,即使是在事实发生这么久之后

如果
ContextMenu
类的
ItemsSource
包含
MenuItem
对象,则图标会很好地落在它所属的位置。一、 和您一样,我使用的是视图模型,不知道如何将UI逻辑注入到我的视图模型类中

我所做的是实现一个值转换器,将视图模型转换为
MenuItem
对象。看起来有点像这样:


XAML:

<UserControl.Resources>
    <local:DelegatedValueConverter
        x:Key="LocalContextItemConverter"
        Converting="OnBindingContextMenu" />
</UserControl.Resources>

...

<toolkit:ContextMenu
    ItemsSource="{Binding ContextMenuItems, Converter={StaticResource LocalContextItemConverter}}" />

...

C#代码隐藏

private void OnBindingContextMenu(object sender, ValueConvertingEventArgs e)
{
    var dataitems = e.Value as IEnumerable< NavigationItemViewModel >;
    if (dataitems != null)
    {
        var items = dataitems.Select(data => new MenuItem()
        {
            Header = data.Title,
            Icon = data.Icon,
            Tag = data
        }).ToList();
        var handler = new RoutedEventHandler(this.OnContextMenuClick);
        items.ForEach(item => item.Click += handler);
        e.Result = items
    }
}

private void OnContextMenuClick(object sender, RoutedEventArgs e)
{
}
private void OnBindingContextMenu(对象发送者,ValueConvertingEventArgs e)
{
var dataitems=e.值为IEnumerable;
如果(数据项!=null)
{
var items=dataitems.Select(data=>newmenuitem()
{
Header=data.Title,
Icon=data.Icon,
标记=数据
}).ToList();
var handler=newroutedEventHandler(this.OnContextMenuClick);
items.ForEach(item=>item.Click+=handler);
e、 结果=项目
}
}
私有void OnContextMenuClick(对象发送方,RoutedEventArgs e)
{
}

讨论

DelegatedValueConverter
是我详细描述的一点东西,但它并不重要。您可以使用自己的值转换器来代替它

我的视图模型的
Title
属性是一个字符串,
Icon
Image
的一个实例。我使用菜单项的
标记
属性保留对视图模型的引用,以便在单击事件期间可以引用其中的非可视数据

这个解决方案很方便,因为它仍然在UI和视图模型之间提供了一些分离,尽管在本例中我更喜欢纯声明性的解决方案


我希望这有帮助

以编程方式创建菜单是可行的,但它打破了我的mvvm模式,这就是为什么我在寻找一些方法来单独绑定创建菜单是可行的,但它打破了我的mvvm模式,这就是为什么我在寻找一些方法来单独绑定