Лучший способ установить высоту подменю MenuItem? - PullRequest
1 голос
/ 16 декабря 2011

У меня в настоящее время есть пункт меню (часть контекстного меню), с ~ 35 пунктами меню. Из-за этого это приводит к огромному подменю. Несмотря на то, что у меня есть возможность прокрутки, я хотел бы установить высоту этого подменю, имея возможность все еще прокручивать.

Я перепутался с панелью MenuItem.Items, но не смог установить высоту подменю и все еще прокручивать.

1 Ответ

2 голосов
/ 17 декабря 2011

К сожалению, WPF не позволяет изменять его свойствами. Вам придется изменить шаблон ControlTemplate по умолчанию.

EDIT: Я исправил запись в блоге об этом здесь

Вот пример (обратите внимание на добавление «MaxHeight» в «SubMenuScrollViewer»):

<Popup x:Name="PART_Popup"
    AllowsTransparency="true"
    Placement="Right"
    VerticalOffset="-3"
    HorizontalOffset="-2"
    IsOpen="{Binding Path=IsSubmenuOpen,RelativeSource={RelativeSource TemplatedParent}}"
    Focusable="false"
    PopupAnimation="{DynamicResource {x:Static SystemParameters.MenuPopupAnimationKey}}">
    <theme:SystemDropShadowChrome Name="Shdw" Color="Transparent">
        <ContentControl Name="SubMenuBorder"
            Template="{DynamicResource {ComponentResourceKey TypeInTargetAssembly={x:Type FrameworkElement}, ResourceId=SubmenuContent}}"
            IsTabStop="false">
            <ScrollViewer Name="SubMenuScrollViewer" CanContentScroll="true" MaxHeight="400" Style="{DynamicResource {ComponentResourceKey TypeInTargetAssembly={x:Type FrameworkElement}, ResourceId=MenuScrollViewer}}">
                <Grid RenderOptions.ClearTypeHint="Enabled">
                    <Canvas Height="0" Width="0" HorizontalAlignment="Left" VerticalAlignment="Top">
                        <Rectangle
                            Height="{Binding ElementName=SubMenuBorder,Path=ActualHeight}" 
                            Width="{Binding ElementName=SubMenuBorder,Path=ActualWidth}" 
                            Fill="{StaticResource SubMenuBackgroundBrush}" />
                    </Canvas>
                    <ItemsPresenter Name="ItemsPresenter" Margin="2"
                        KeyboardNavigation.TabNavigation="Cycle"
                        KeyboardNavigation.DirectionalNavigation="Cycle"
                        SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
                        Grid.IsSharedSizeScope="true"/>
                </Grid>
            </ScrollViewer>
        </ContentControl>
    </theme:SystemDropShadowChrome>
</Popup>

Это просто для переопределения темы Aero. Как вы можете видеть, существует много XAML для MenuItem, поэтому он не изящен. Просто сделайте отдельный ResourceDictionary, чтобы сохранить вещи в порядке.

...