كيف تحصل القائمة لفتح إلى اليسار في برنامج الأغذية العالمي؟

StackOverflow https://stackoverflow.com/questions/1010962

  •  06-07-2019
  •  | 
  •  

سؤال

ولدي القائمة (مع menuitems) في برنامج الأغذية العالمي. وللأسف عندما كنت اضغط على القائمة متجهة أنه يفتح القائمة إلى اليمين. المشكلة هي أن هناك الاشياء على الجهة اليمنى والذي لا أريد أن تتداخل. كيف يمكنني معرفة WPF لفتح القائمة إلى اليسار؟ هل أنا بحاجة للقيام قالب السيطرة؟ (قوالب السيطرة يبدو ذلك بغلظة لمثل هذه التغييرات نمط الأساسية).

وشكرا!

وKSG

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

المحلول

وبينما يمكنك إنشاء ControlTemplate للقيام بذلك كما يفعلون هنا ، أوافق على أن ذلك هو وسيلة مرهقة فقط لتعديل قيمة واحدة على جزء من MenuItems. بدلا من ذلك، وأعتقد أن هذا هو مكان عظيم لاستخدام AttachedProperty. يمكننا خلق شيء تماما مثل ContextMenuService ، ولكن لبالنوافذ (في الواقع، أنا مندهش بعض الشيء أنه ليس بنيت في).

لتغيير مكان المنبثقة تفتح، ونحن ذاهبون إلى تريد تعيين PlacementMode قافزة ل. يمكننا استخدام الاختصار propa لتوليد دينا AttachedProperty (أو خصائص إذا كنت تريد تنفيذ بقية). نحن بحاجة إلى إضافة رد إلى PropertyMetadata لدينا، ولكن إذا تم تعيين AttachedProperty مضمنة في جهاز التحكم في XAML ثم فإن رد إطلاق النار قبل أن يتم بناؤها سيطرة كاملة تماما. لضمان تطبيق القالب MENUITEM، ووقافزة موجود قبل أن نحاول وتعيين قيمة انها، يمكننا أن نعلق فقط إلى الحدث المحملة إذا لم يتم تحميل بالفعل. مرة واحدة يتم تحميل، ونحن نريد لاسترداد قافزة من القالب، وإذا نظرنا في الطبقة MENUITEM يمكننا أن نرى أن لديها TemplatePartAttribute تحديد اسم قافزة بأنها" PART_Popup ". مرة واحدة لدينا ذلك، فإننا يمكن أن يحدد PlacementMode على قافزة على MENUITEM ل.

    public static PlacementMode GetMenuPlacement(DependencyObject obj)
    {
        return (PlacementMode)obj.GetValue(MenuPlacementProperty);
    }

    public static void SetMenuPlacement(DependencyObject obj, PlacementMode value)
    {
        obj.SetValue(MenuPlacementProperty, value);
    }

    // Using a DependencyProperty as the backing store for MenuPlacement.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty MenuPlacementProperty =
        DependencyProperty.RegisterAttached("MenuPlacement",
        typeof(PlacementMode),
        typeof(Window1),
        new FrameworkPropertyMetadata(PlacementMode.Bottom, FrameworkPropertyMetadataOptions.Inherits, new PropertyChangedCallback(OnMenuPlacementChanged)));

    private static void OnMenuPlacementChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
    {
        var menuItem = o as MenuItem;
        if (menuItem != null)
        {
            if (menuItem.IsLoaded)
            {
                SetPopupPlacement(menuItem, (PlacementMode)e.NewValue);
            }
            else
            {
                menuItem.Loaded += new RoutedEventHandler((m, v) => SetPopupPlacement(menuItem, (PlacementMode)e.NewValue));
            }
        }
    }

    private static void SetPopupPlacement(MenuItem menuItem, PlacementMode placementMode)
    {
        Popup popup = menuItem.Template.FindName("PART_Popup", menuItem) as Popup;
        if (popup != null)
        {
            popup.Placement = placementMode;
        }
    }

والآن لدينا AttachedProperty لدينا، فإنه من السهل لتغيير وضع المنبثقة في واجهة المستخدم.

<Menu>
    <MenuItem Header="Item 1"
              local:Window1.MenuPlacement="Right">
        <MenuItem Header="SubItem 1" />
        <MenuItem Header="SubItem 2" />
        <MenuItem Header="SubItem 3" />
        <MenuItem Header="SubItem 4" />
    </MenuItem>
    <MenuItem Header="Item 2"
              local:Window1.MenuPlacement="Left">
        <MenuItem Header="SubItem 5" />
        <MenuItem Header="SubItem 6" />
        <MenuItem Header="SubItem 7" />
        <MenuItem Header="SubItem 8" />
    </MenuItem>
    <MenuItem Header="Item 3"
              local:Window1.MenuPlacement="Mouse">
        <MenuItem Header="SubItem 9" />
        <MenuItem Header="SubItem 10" />
        <MenuItem Header="SubItem 11" />
        <MenuItem Header="SubItem 12" />
    </MenuItem>
</Menu>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top