2016-03-31 10 views
5

में सेट किया गया है, तो मुझे IsOverflowOpen और HasOverflowItems गुणों के बारे में पता है, लेकिन मैं यह बताने के लिए एक तरीका ढूंढ रहा हूं कि आइटम (बटन, रेडियोबुटटन ...) टूलबारऑफ्लोफैनेल में स्थानांतरित हो गया है, इसलिए मैं कर सकता हूं अपनी शैली बदलने के लिए एक ट्रिगर का उपयोग करें।डब्ल्यूपीएफ टूलबार - पता लगाएं कि जब आइटम ToolBarOverflowPanel

मुझे कुछ यूडब्लूपी टूलबार शैलियों (विंडोज 10 मेल, वर्ड, एक्सेल ...) को पुन: उत्पन्न करने में सक्षम होने की आवश्यकता है। मैंने सफलतापूर्वक अधिकांश शैली को पुन: उत्पन्न किया है और केवल एक ही लापता बिट है जब यह ओवरफ्लो पैनल में है तो मेरे आइटम की शैली को बदल सकता है।

जो मैं पुन: पेश करने की कोशिश कर रहा हूं उसके स्क्रीनशॉट पर, आप स्पष्ट रूप से देख सकते हैं कि स्पेशल आइडेंट और लाइन स्पेसिंग बटन ने शैली को बदल दिया है या नहीं, यह दिखाया गया है कि वे प्रदर्शित होते हैं या बहते हैं। Windows 10 ToolBar Style Screenshot

उत्तर

5

आप इसे केवल xaml के साथ नहीं कर सकते हैं। आपको या तो कोड का उपयोग करना होगा या कुछ संलग्न गुण बनाना होगा।

सबसे पहले आप एक सहायक वर्ग को उजागर 2 गुण बनाने की जरूरत:

  • IsInOverflowPanel केवल पढ़ने के लिए संपत्ति है कि आप शैली परिवर्तन को गति प्रदान करने का उपयोग करेगा

    यहाँ AttachedProperty साथ समाधान है।

  • TrackParentPanel प्रॉपर्टी, जो सक्षम/अक्षम तंत्र है।

    public static class ToolBarHelper 
    { 
        public static readonly DependencyPropertyKey IsInOverflowPanelKey = 
         DependencyProperty.RegisterAttachedReadOnly("IsInOverflowPanel", typeof(bool), typeof(ToolBarHelper), new PropertyMetadata(false)); 
    
        public static readonly DependencyProperty IsInOverflowPanelProperty = IsInOverflowPanelKey.DependencyProperty; 
    
        [AttachedPropertyBrowsableForType(typeof(UIElement))] 
        public static bool GetIsInOverflowPanel(UIElement target) 
        { 
         return (bool)target.GetValue(IsInOverflowPanelProperty); 
        } 
    
        public static readonly DependencyProperty TrackParentPanelProperty = 
         DependencyProperty.RegisterAttached("TrackParentPanel", typeof(bool), typeof(ToolBarHelper), 
                  new PropertyMetadata(false, OnTrackParentPanelPropertyChanged)); 
    
        public static void SetTrackParentPanel(DependencyObject d, bool value) 
        { 
         d.SetValue(TrackParentPanelProperty, value); 
        } 
    
        public static bool GetTrackParentPanel(DependencyObject d) 
        { 
         return (bool)d.GetValue(TrackParentPanelProperty); 
        } 
    
        private static void OnTrackParentPanelPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
        { 
         var element = d as UIElement; 
         if (element != null) 
         { 
          bool newValue = (bool)e.NewValue; 
          if (newValue) 
          { 
           element.LayoutUpdated += (s, arg) => OnControlLayoutUpdated(element); 
          } 
         } 
        } 
        private static void OnControlLayoutUpdated(UIElement element) 
        { 
         var isInOverflow = TreeHelper.FindParent<ToolBarOverflowPanel>(element) != null; 
         element.SetValue(IsInOverflowPanelKey, isInOverflow); 
        } 
    } 
    
    public static class TreeHelper 
    { 
        public static T FindParent<T>(this DependencyObject obj) where T : DependencyObject 
        { 
         return obj.GetAncestors().OfType<T>().FirstOrDefault(); 
        } 
    
        public static IEnumerable<DependencyObject> GetAncestors(this DependencyObject element) 
        { 
         do 
         { 
          yield return element; 
          element = VisualTreeHelper.GetParent(element); 
         } while (element != null); 
        } 
    } 
    

    फिर, हर आइटम जो शैली को बदलने की जरूरत के लिए निम्न करें::

यहाँ कार्यान्वयन है

<Button x:Name="DeleteButton" Content="Delete" helpers:ToolBarHelper.TrackParentPanel="True"> 
    <Button.Style> 
     <Style BasedOn="{StaticResource {x:Static ToolBar.ButtonStyleKey}}" TargetType="{x:Type Button}"> 
      <Style.Triggers> 
       <Trigger Property="helpers:ToolBarHelper.IsInOverflowPanel" Value="True"> 
        <!-- The Overflow style setters --> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </Button.Style> 
</Button> 
संबंधित मुद्दे