Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.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
C# 为菜单项使用DataTemplate会在左侧显示额外的空间吗?_C#_Wpf_Menuitem - Fatal编程技术网

C# 为菜单项使用DataTemplate会在左侧显示额外的空间吗?

C# 为菜单项使用DataTemplate会在左侧显示额外的空间吗?,c#,wpf,menuitem,C#,Wpf,Menuitem,每当我将DataTemplate附加到MenuItem时,每个生成的菜单项都会在左侧获得额外的空间。这个额外的空间看起来和我使用的支票预留空间一样宽。在没有数据模板的情况下手动构建菜单不会增加额外的空间。作为一个额外的褶皱,如果我点击这个额外的空间,菜单项就会消失,但不会生成点击事件。我不知道它为什么要增加这个额外的空间。有什么想法吗 我的xaml代码再简单不过了: 包含所述额外空格的菜单: <Menu> <MenuItem Header="Enemies" Items

每当我将DataTemplate附加到MenuItem时,每个生成的菜单项都会在左侧获得额外的空间。这个额外的空间看起来和我使用的支票预留空间一样宽。在没有数据模板的情况下手动构建菜单不会增加额外的空间。作为一个额外的褶皱,如果我点击这个额外的空间,菜单项就会消失,但不会生成点击事件。我不知道它为什么要增加这个额外的空间。有什么想法吗

我的xaml代码再简单不过了:

包含所述额外空格的菜单:

<Menu>
    <MenuItem Header="Enemies" ItemsSource="{Binding AvailableEnemyClasses}">
        <MenuItem.ItemTemplate>
            <DataTemplate>
                <MenuItem Header="{Binding}">
                </MenuItem>
            </DataTemplate>
        </MenuItem.ItemTemplate>
    </MenuItem>
</Menu>
<Menu>
    <MenuItem Header="Utilities" >
        <MenuItem Header="Enemy01"/>
        <MenuItem Header="Enemy02"/>
        <MenuItem Header="Enemy03"/>
    </MenuItem>
</Menu>

没有额外空格的菜单:

<Menu>
    <MenuItem Header="Enemies" ItemsSource="{Binding AvailableEnemyClasses}">
        <MenuItem.ItemTemplate>
            <DataTemplate>
                <MenuItem Header="{Binding}">
                </MenuItem>
            </DataTemplate>
        </MenuItem.ItemTemplate>
    </MenuItem>
</Menu>
<Menu>
    <MenuItem Header="Utilities" >
        <MenuItem Header="Enemy01"/>
        <MenuItem Header="Enemy02"/>
        <MenuItem Header="Enemy03"/>
    </MenuItem>
</Menu>

这是因为您的
数据模板生成的可视化树将被包装在一个容器中—在本例中,是一个
菜单项。因此,实际上在
MenuItem
中有一个
MenuItem
,这解释了额外的空间和缺乏交互性的原因。无需在
项目模板中包含
菜单项

您的示例可以写成:

<Menu>
    <MenuItem Header="Enemies" ItemsSource="{Binding AvailableEnemyClasses}">
        <MenuItem.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding}"/>
            </DataTemplate>
        </MenuItem.ItemTemplate>
    </MenuItem>
</Menu>

或者,也许更简洁地说:

<Menu>
    <MenuItem Header="Enemies" ItemsSource="{Binding AvailableEnemyClasses}">
        <MenuItem.ItemContainerStyle>
            <Style TargetType="MenuItem">
                <Setter Property="Header" Value="{Binding}"/>
                <Setter Property="IsChecked">
                    <Setter.Value>
                        <MultiBinding Converter="{StaticResource YourConverter}">
                            <Binding .../>
                            <Binding .../>
                        </MultiBinding>
                    </Setter.Value>
                </Setter>
            </Style>
        </MenuItem.ItemContainerStyle>
    </MenuItem>
</Menu>


谢谢您的回答!我还有另一个问题:对于ItemContainerStyle,如何将MenuItem的IsChecked属性绑定到多重绑定?没问题。这可能是一个单独的问题,但我更新了我的答案,告诉你怎么做。啊,现在我明白了。谢谢你,肯特!回答得很好,我正在处理与原始问题类似的问题。根据您的回答,转换器是将IsChecked设置为仅对某些子级为true的唯一方法,还是有其他方法(例如触发器)?非常感谢。我已经发布了一个问题()你的转换器将实际转换什么?更多信息:另请参见: