سؤال

أنا أعمل على بعض XAML لتطبيق WPF وأوهذه مشكلة في الحصول عليها للقيام بما أريد. هنا عينة من XAML الخاص بي:

<!-- Tool Bar Tray -->
<ToolBarTray Name="toolBarTray1" DockPanel.Dock="Top">
    <!-- File And Edit Tools -->
    <ToolBar Name="toolBar1" Band="1" BandIndex="1">
        <!-- Regular Items -->
        <Button>A</Button>
        <Button>B</Button>
        <!-- Overflow Menu For Special Items -->
        <MenuItem ToolBar.OverflowMode="Always" Header="Special Items">
            <MenuItem Header="C"/>
            <MenuItem Header="D"/>
        </MenuItem>
    </ToolBar>
</ToolBarTray>

عندما أضغط على زر تجاوز تجاوز شريط الأدوات، تظهر "البنود الخاصة" من السهم القليل بجانبه، مما يشير إلى العناصر المتداخلة. ومع ذلك، عندما أحويم الماوس فوق "عناصر خاصة" أو محاولة النقر فوقه، لا يتم عرض Menuitems "C" و "D".

كنت آمل أن تعمل Menuitem فقط خارج القائمة، لكنني حاولت أن أفعل الشيء المستقيم الأمامي، فقط في حالة. بما في ذلك هذه المنظمات داخل القائمة، وبدلا من ذلك، إعطاء هذه القائمة ToolBar.overflowMode = "دائما" خاصية تنتج بعض التصميم غير المرغوب فيه. لم يعد السهم موجودا، يجب النقر فوق "البنود الخاصة" عند تنشيط القائمة الفرعية ووضع تحديد المواقع القائمة الفرعية قليلا.

لا أحد يعرف ما الذي يجري؟

تحرير: إضافة قائمة إلى الفائض تنتج تماما ما طلبته (مفاجأة كبيرة). ما أنا بعد وسيلة لتحويل رؤوس المستوى الأعلى والعناصر إلى مستوى القائمة الفرعية. لقد تحولت نحو مثال قالب التحكم هذا MSDN. لحل (أدناه).

تحرير، تحرير: gccores (مناقشة التعليق): حقا؟ هل فاتني شيء؟

<ToolBar Name="toolBar1" Band="1" BandIndex="4"> 
    <!-- Displayed Buttons -->
    <Button>A</Button>
    <Button>B</Button>
    <!-- Special Items Menu -->
    <Menu ToolBar.OverflowMode="Always" >
        <MenuItem Style="{StaticResource MenuItemStyle}" Header="Special">
            <MenuItem Header="C"/>
            <MenuItem Header="D"/>
        </MenuItem>
    </Menu>
</ToolBar>

هذا القصاص لا يعمل بالنسبة لي. يجب أن النقر فوق "خاص" للحصول على القائمة الفرعية لعرضها.

هل كانت مفيدة؟

المحلول

الطريقة الوحيدة التي يمكنني العثور عليها حتى عن قربها لتوليد هذا السلوك هي إنشاء قائمة في تجاوز الفضيل والتي تحتوي على عنصر قائمة واحد كان رأسه نفسه عنصر قائمة آخر يسمى "العناصر الخاصة" وتحتوي على الأطفال المناسبين. عملت على النحو المقصود ولكن بدا Bizarre (يمكن علاج هذا بواسطة قوالب مخصصة) ويبدو أيضا مثل الاختراق الضخم. الطريقة الوحيدة "المناسبة" للقيام بذلك التي يمكنني التفكير فيها من شأنها أن تفكر في السيطرة التي يشبها السهم الخاص بك والتي تنبثق السياق أو المنبثقة عند التحليق، لأنني لا أعتقد أن التحكم المخصص يمكن أن يغير السلوك الافتراضي قائمة حتى لا تتطلب نقرة على عنصر المستوى الأعلى.

نصائح أخرى

حل آخر هو استخدام القوالب الحالية وتجاوز القالب ل TopLevelHeader مع قالب القائمة الفرعية.

<Style x:Key="MenuItemStyle" TargetType="{x:Type MenuItem}">
  <Style.Triggers>
    <Trigger Property="Role" Value="TopLevelHeader">
      <Setter Property="Template"
              Value="{StaticResource {x:Static MenuItem.SubmenuHeaderTemplateKey}}"/>
    </Trigger>
  </Style.Triggers> 
</Style>

واستخدام هذا النمط في منحة المستوى الأعلى الخاص بك. يجب أن تبسيط التعليمات البرمجية الخاصة بك.

تعديل: أنت على حق، فإنه يعمل فقط عند النقر فوقه (لا أعرف كيف أقنعت نفسي، آسف :)). إنها وظيفة مثل toplevelmenu على الرغم من أن القالب يقول خلاف ذلك، فإنه مربك للغاية.

الشيء الوحيد الذي يمكنني التفكير فيه هو إضافة الزناد لإظهار القائمة الفرعية على iSmenuover والتعامل مع الحدث انقر بحيث لا تفعل شيئا سوى لا أعرف مدى جودة العمل.

بعد المزيد من القراءة، الحل الذي أستخدمه أدناه.

<!-- Resource Dictionary Stuff -->

<!-- Some Brushes -->
<SolidColorBrush x:Key="Brush_1"
    Color="White" />

<LinearGradientBrush x:Key="Brush_2"
    StartPoint="0 0"
    EndPoint="0 1">

    <GradientStop
        Color="White"
        Offset="0"/>

    <GradientStop 
        Color="DarkSeaGreen"
        Offset="1"/>

</LinearGradientBrush>

<SolidColorBrush x:Key="Brush_3"
    Color="DarkOliveGreen"/>

<!-- Custom MenuItem - Top Level Header - Style 1 -->
<Style x:Key="MenuItem_TLH_Style1"
    TargetType="MenuItem">

    <!--<EventSetter Event="PreviewMouseDown" Handler="DoNothing"/>-->

    <Setter Property="Template">
        <Setter.Value>

            <ControlTemplate x:Name="ControlTemplate"
                TargetType="MenuItem">

                <!-- A headered text that may display a submenu
                     on a trigger. This submenu is the host for a
                     menu item's items. -->
                <Border x:Name="BoundaryBorder"
                    Background="{StaticResource Brush_1}"
                    BorderThickness="1">

                    <Grid x:Name="ContainerGrid">

                        <ContentPresenter x:Name="HeaderContent"
                            Margin="6 3 6 3" 
                            ContentSource="Header"
                            RecognizesAccessKey="True"/>

                        <Popup x:Name="SubmenuPopup"
                            Placement="Bottom"
                            IsOpen="{TemplateBinding IsSubmenuOpen}"
                            AllowsTransparency="True"
                            Focusable="False"
                            PopupAnimation="Fade">

                            <Border x:Name="SubmenuBoundaryBorder"
                                SnapsToDevicePixels="True"
                                Background="{StaticResource Brush_1}"
                                BorderBrush="{StaticResource SolidBorderBrush}"
                                BorderThickness="1">

                                <StackPanel x:Name="ItemsStackPanel"
                                    IsItemsHost="True"
                                    KeyboardNavigation.DirectionalNavigation="Cycle"/>

                            </Border>
                        </Popup>
                    </Grid>
                </Border>

                <ControlTemplate.Triggers>

                    <!--  -->
                    <Trigger
                        Property="IsSuspendingPopupAnimation"
                        Value="true">

                        <Setter 
                            TargetName="SubmenuPopup"
                            Property="PopupAnimation"
                            Value="Fade"/>

                    </Trigger>

                    <!-- On mouse-over, show the submenu and highlight the header. -->
                    <Trigger 
                        Property="IsMouseOver"
                        Value="true">

                        <Setter 
                            TargetName="BoundaryBorder"
                            Property="Background"
                            Value="{StaticResource Brush_2}"/>

                        <Setter 
                            TargetName="BoundaryBorder"
                            Property="BorderBrush"
                            Value="{StaticResource Brush_3}"/>

                        <Setter
                            Property="IsSubmenuOpen"
                            Value="true"/>

                        <!-- sloppy? -->
                        <Setter
                            TargetName="SubmenuPopup"
                            Property="IsOpen"
                            Value="true"/>

                    </Trigger>

                    <Trigger 
                        SourceName="SubmenuPopup"
                        Property="AllowsTransparency"
                        Value="true">

                        <Setter 
                            TargetName="SubmenuBoundaryBorder"
                            Property="CornerRadius"
                            Value="0 0 4 4"/>

                        <Setter 
                            TargetName="SubmenuBoundaryBorder"
                            Property="Padding"
                            Value="0 0 0 3"/>

                    </Trigger>

                    <!-- Visually indicate an unaccessible menu item. -->
                    <Trigger
                        Property="IsEnabled"
                        Value="false">

                        <Setter 
                            Property="Foreground"
                            Value="{StaticResource DisabledForegroundBrush}"/>

                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

<!-- ... -->

<!-- Inside a window XAML file -->

<!-- Tool Bar Tray -->
<ToolBarTray x:Name="toolBarTray1"
    DockPanel.Dock="Top">

    <!-- File And Edit Tools -->
    <ToolBar x:Name="toolBar1" 
        Band="1" BandIndex="1">

        <!-- Displayed Buttons -->
        <Button x:Name="ButtonA"
            Content="A"/>

        <Button x:Name="ButtonB"
            Content="B"/>

        <!-- Overflow Menu For Special Items -->
        <Menu x:Name="OverflowMenu"
            ToolBar.OverflowMode="Always">

            <MenuItem x:Name="SpecialsMenuItem" 
                Style="{StaticResource MyStyle}"
                Header="Special Items">

                <MenuItem x:Name="CMenuItem"
                    Header="C">

                    <MenuItem x:Name="DMenuItem"
                        Header="D"/>

                </MenuItem>
            </MenuItem>
        </Menu>
    </ToolBar>
</ToolBarTray>

أنا مهاجمة سلوك "القائمة الفرعية" على الماوس، بدلا من التعامل مع الحدث انقر. أود أن أفهم هذا أكثر اكتمالا، لذلك حاولت التعليق على هذا الجزء من الزناد وإضافة معالج حدث يستدعي "Donothing ()" في حدث "PreviewMousedown". اتضح أنني أفتقد شيئا وأعتقد أنه مرتبط بالتركيز و / أو كيف تعالج القائمة مجموعة العناصر الخاصة بها. عدم السماح للحدث بنشره بعد "Donothing ()" (RouteDeventargs.handled = True) يبدو أن القضاء على المشكلات عند النقر فوق عنصر القائمة "العناصر الخاصة". ومع ذلك، إذا قام أحد بالتنقل بعيدا عن القائمة أو إضافة عنصر قائمة آخر ثم النقر فوق ذلك، يمكن إيقاف تشغيل أو إيقاف تشغيل سلوك التحويم وإيقاف تشغيله.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top