2016-03-31 22 views
5

Jestem świadomy właściwości IsOverflowOpen i HasOverflowItems, ale szukam sposobu na sprawdzenie, czy element (przycisk, radiobutton ...) został przeniesiony do ToolBarOverflowPanel, więc mogę użyj wyzwalacza, aby zmienić jego styl.Pasek narzędzi WPF - Wykrywanie, gdy element jest ustawiony na ToolBarOverflowPanel

Potrzebuję tego, aby móc odtworzyć niektóre style UWP ToolBar (Windows 10 Mail, Word, Excel ...). Udało mi się odtworzyć większość stylu, a jedynym brakującym bitem jest możliwość zmiany stylu mojego elementu, gdy znajduje się on w panelu przelewu.

Na zrzucie ekranu tego, co próbuję odtworzyć, wyraźnie widać, że przyciski Odcinek specjalny i Odstępy między wierszami zmieniły styl w zależności od tego, czy są wyświetlane, czy przepełnione. Windows 10 ToolBar Style Screenshot

Odpowiedz

5

Nie można tego zrobić tylko przy użyciu xaml. Musisz albo użyć kodu z tyłu, albo utworzyć kilka załączonych właściwości.

Oto rozwiązanie z AttachedProperty:

Najpierw trzeba utworzyć klasy pomocnika wystawiając 2 nieruchomości:

  • IsInOverflowPanel właściwość tylko do odczytu, które można użyć, aby wywołać zmianę stylu.
  • Właściwość TrackParentPanel, która jest mechanizmem włączania/wyłączania.

Oto realizacja:

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); 
    } 
} 

Następnie dla każdej pozycji, które trzeba zmienić styl wykonaj następujące czynności:

<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> 
Powiązane problemy