【问题标题】:How to stretch the content of a templated MenuItem using WPF如何使用 WPF 拉伸模板化 MenuItem 的内容
【发布时间】:2021-05-31 13:14:11
【问题描述】:

在我的 WPF 应用程序中,我有一个如下定义的菜单:

<Menu
    Grid.Column="1"
    MinWidth="50"
    MinHeight="50"
    HorizontalAlignment="Stretch"
    VerticalAlignment="Stretch"
    Background="Transparent"
    Visibility="{Binding Path=ShowSynergies, Converter={StaticResource BoolToVisConverter}}">
    
    <Menu.ItemsPanel>
        <ItemsPanelTemplate>
            <Grid />
        </ItemsPanelTemplate>
    </Menu.ItemsPanel>
    
    <MenuItem
        HorizontalAlignment="Stretch"
        VerticalAlignment="Stretch"
        VerticalContentAlignment="Stretch"
        BorderBrush="Black"
        BorderThickness="1"
        ItemsSource="{Binding Path=CurrentlyAvailableSynergies, Source={StaticResource ResourceKey=VM}}">
        <MenuItem.Header>
            <TextBlock
                Margin="5"
                FontSize="18"
                Text="{Binding Path=ActiveSynergy.Synergy, Source={StaticResource ResourceKey=VM}}"
                TextAlignment="Center" />
        </MenuItem.Header>
        <MenuItem.ToolTip>
            <TextBlock Text="{Binding Path=ActiveSynergy.Synergy, Source={StaticResource ResourceKey=VM}}" />
        </MenuItem.ToolTip>
        <MenuItem.Resources>
            <HierarchicalDataTemplate DataType="{x:Type ent:VisualSynergy}" ItemsSource="{Binding Path=AvailableDiameters}">
                <TextBlock Text="{Binding SynergyText}"/>
            </HierarchicalDataTemplate>
    
            <DataTemplate DataType="{x:Type ent:VisualDiameter}">
                <TextBlock
                    VerticalAlignment="Stretch"
                    Background="Purple"
                    Text="{Binding Path=VisualValue}">
                    <intr:Interaction.Triggers>
                        <intr:EventTrigger EventName="PreviewMouseLeftButtonDown">
                            <intr:InvokeCommandAction Command="{Binding Path=SelectSynergyCommand}">
                                <intr:InvokeCommandAction.CommandParameter>
                                    <MultiBinding Converter="{StaticResource ResourceKey=StdMultiConverter}">
                                        <Binding Path="." />
                                        <Binding Path="." Source="{StaticResource ResourceKey=VM}" />
                                    </MultiBinding>
                                </intr:InvokeCommandAction.CommandParameter>
                            </intr:InvokeCommandAction>
                        </intr:EventTrigger>
                    </intr:Interaction.Triggers>
                </TextBlock>
    
            </DataTemplate>
        </MenuItem.Resources>
    </MenuItem>
</Menu>

一切都按预期工作,所有数据都正确绑定并在应该更新时更新。 我最大的问题是最后的TextBlock(与我的VisualDiameter 类型相关的那个)不会拉伸以填满整个MenuItem 可用空间(见截图)。我也尝试过重新定义样式,但由于我在 MenuItem 资源定义中,所以缺少一些东西并且不会发生拉伸。

看看其他问题,我的问题似乎与 Microsoft 对 TreeViewMenuItem 的奇怪定义有关,但我没有足够的信心开始修改基本模板。

【问题讨论】:

  • 所以你想让叶子节点是紫色的?或者你到底想在这里伸展什么?
  • 紫色只是为了显示TextBlock的扩展名。我希望 Textblock 填充其右侧的所有空间,因为我的目标是将命令绑定到 TextBlock 本身的单击事件,并且我想最大化“单击区域”。

标签: wpf templates menu header menuitem


【解决方案1】:

您应该定义一个ItemContainerStyle 并绑定MenuItem 容器的Command 属性,而不是尝试在DataTemplate 中拉伸TextBlock

<MenuItem
        HorizontalAlignment="Stretch"
        VerticalAlignment="Stretch"
        VerticalContentAlignment="Stretch"
        BorderBrush="Black"
        BorderThickness="1"
        ItemsSource="{Binding Path=CurrentlyAvailableSynergies}">
    <MenuItem.ItemContainerStyle>
        <Style TargetType="MenuItem">
            <Setter Property="Command" Value="{Binding SelectSynergyCommand}" />
        </Style>
    </MenuItem.ItemContainerStyle>
    <MenuItem.Header>
    ...

【讨论】:

  • 我明白了,但这不适用于Menu 中的每个MenuItem 吗?
  • 更新:我试过了,因为我认为每次将鼠标悬停在 MenuItem 上时都会启动命令(如屏幕截图中的 All99,5 Ar),但我需要启动命令当用户点击子菜单中的数字时(如屏幕截图中的 1,2)
  • 悬停时不调用该命令。它仅在单击时调用。
  • 如果您想有条件地调用它,您可以使用DataTrigger 或在Execute 方法中对某些对象不执行任何操作。
猜你喜欢
  • 1970-01-01
  • 2013-04-03
  • 2018-07-13
  • 1970-01-01
  • 1970-01-01
  • 2011-03-16
  • 1970-01-01
  • 1970-01-01
  • 2018-08-02
相关资源
最近更新 更多