diff --git a/Changelog.md b/Changelog.md index 629f80462..c6e535c21 100644 --- a/Changelog.md +++ b/Changelog.md @@ -3,6 +3,8 @@ ## 7.1.0 - ### Bug fixes - [#745](../../issues/745) - SplitButton.IsEnabled based on Command.CanExecute? + - [#765](../../issues/765) - InRibbonGallery Resizing Issues + - [#766](../../issues/766) - Resizing of InRibbonGallery in a DataTemplate does not work - ### Enhancements/Features - Many automation peers have been added and improved diff --git a/Fluent.Ribbon/Controls/BackstageTabControl.cs b/Fluent.Ribbon/Controls/BackstageTabControl.cs index f164827c5..1e06680e8 100644 --- a/Fluent.Ribbon/Controls/BackstageTabControl.cs +++ b/Fluent.Ribbon/Controls/BackstageTabControl.cs @@ -9,6 +9,7 @@ namespace Fluent using System.Windows.Controls; using System.Windows.Controls.Primitives; using System.Windows.Media; + using Fluent.Extensions; using Fluent.Internal; using Fluent.Internal.KnownBoxes; @@ -391,17 +392,17 @@ protected override void OnSelectionChanged(SelectionChangedEventArgs e) /// The currently selected . Or null of nothing was selected and nothing could be selected. private BackstageTabItem GetSelectedTabItem() { - var container = this.ItemContainerGenerator.ContainerFromItem(this.SelectedItem) as BackstageTabItem - ?? (this.ItemContainerGenerator.ContainerFromItem(this.SelectedItem) as ContentPresenter)?.Content as BackstageTabItem; + var container = this.ItemContainerGenerator.ContainerOrContainerContentFromItem(this.SelectedItem); + if (container == null - || container?.IsEnabled == false - || container?.Visibility != Visibility.Visible) + || container.IsEnabled == false + || container.Visibility != Visibility.Visible) { container = this.FindNextTabItem(this.SelectedIndex, 1); if (container != null) { - this.SelectedItem = this.ItemContainerGenerator.ItemFromContainer(container); + this.SelectedItem = this.ItemContainerGenerator.ItemFromContainerOrContainerContent(container); } } @@ -430,8 +431,7 @@ private BackstageTabItem FindNextTabItem(int startIndex, int direction) index = this.Items.Count - 1; } - var container = this.ItemContainerGenerator.ContainerFromIndex(index) as BackstageTabItem - ?? (this.ItemContainerGenerator.ContainerFromIndex(index) as ContentPresenter)?.Content as BackstageTabItem; + var container = this.ItemContainerGenerator.ContainerOrContainerContentFromIndex(index); if (container != null && container.IsEnabled && container.Visibility == Visibility.Visible) diff --git a/Fluent.Ribbon/Controls/BackstageTabItem.cs b/Fluent.Ribbon/Controls/BackstageTabItem.cs index 6475c1093..fd011a640 100644 --- a/Fluent.Ribbon/Controls/BackstageTabItem.cs +++ b/Fluent.Ribbon/Controls/BackstageTabItem.cs @@ -7,6 +7,8 @@ namespace Fluent using System.Windows.Controls; using System.Windows.Controls.Primitives; using System.Windows.Input; + using Fluent.Extensions; + using Fluent.Helpers; using Fluent.Internal.KnownBoxes; /// @@ -76,7 +78,7 @@ internal BackstageTabControl TabControlParent { get { - return ItemsControl.ItemsControlFromItemContainer(this) as BackstageTabControl; + return ItemsControlHelper.ItemsControlFromItemContainer(this) as BackstageTabControl; } } @@ -148,11 +150,11 @@ private static void OnIsSelectedChanged(DependencyObject d, DependencyPropertyCh if (newValue) { if (container.TabControlParent != null - && ReferenceEquals(container.TabControlParent.ItemContainerGenerator.ContainerFromItem(container.TabControlParent.SelectedItem), container) == false) + && ReferenceEquals(container.TabControlParent.ItemContainerGenerator.ContainerOrContainerContentFromItem(container.TabControlParent.SelectedItem), container) == false) { UnselectSelectedItem(container.TabControlParent); - container.TabControlParent.SelectedItem = container.TabControlParent.ItemContainerGenerator.ItemFromContainer(container); + container.TabControlParent.SelectedItem = container.TabControlParent.ItemContainerGenerator.ItemFromContainerOrContainerContent(container); } container.OnSelected(new RoutedEventArgs(Selector.SelectedEvent, container)); @@ -170,7 +172,7 @@ private static void UnselectSelectedItem(BackstageTabControl backstageTabControl return; } - if (backstageTabControl.ItemContainerGenerator.ContainerFromItem(backstageTabControl.SelectedItem) is BackstageTabItem backstageTabItem) + if (backstageTabControl.ItemContainerGenerator.ContainerOrContainerContentFromItem(backstageTabControl.SelectedItem) is BackstageTabItem backstageTabItem) { backstageTabItem.IsSelected = false; } diff --git a/Fluent.Ribbon/Controls/ComboBox.cs b/Fluent.Ribbon/Controls/ComboBox.cs index e32ffef7e..db887fe77 100644 --- a/Fluent.Ribbon/Controls/ComboBox.cs +++ b/Fluent.Ribbon/Controls/ComboBox.cs @@ -12,7 +12,7 @@ namespace Fluent using System.Windows.Media.Imaging; using System.Windows.Threading; using Fluent.Extensions; - using Fluent.Internal; + using Fluent.Helpers; using Fluent.Internal.KnownBoxes; /// @@ -413,7 +413,7 @@ private void BringSelectedItemIntoView() return; } - var containerFromItem = this.quickAccessCombo.ItemContainerGenerator.ContainerFromItem(this.quickAccessCombo.SelectedItem) as FrameworkElement; + var containerFromItem = this.quickAccessCombo.ItemContainerGenerator.ContainerOrContainerContentFromItem(this.quickAccessCombo.SelectedItem); containerFromItem?.BringIntoView(); } @@ -570,7 +570,7 @@ protected override void OnDropDownOpened(EventArgs e) if (this.SelectedItem != null) { - Keyboard.Focus(this.ItemContainerGenerator.ContainerFromItem(this.SelectedItem) as IInputElement); + Keyboard.Focus(this.ItemContainerGenerator.ContainerOrContainerContentFromItem(this.SelectedItem)); } this.focusedElement = Keyboard.FocusedElement; @@ -636,9 +636,9 @@ private void OnFocusedElementLostKeyboardFocus(object sender, KeyboardFocusChang this.focusedElement.LostKeyboardFocus += this.OnFocusedElementLostKeyboardFocus; if (this.IsEditable && - this.Items.Contains(this.ItemContainerGenerator.ItemFromContainer((DependencyObject)Keyboard.FocusedElement))) + this.Items.Contains(this.ItemContainerGenerator.ItemFromContainerOrContainerContent((DependencyObject)Keyboard.FocusedElement))) { - this.SelectedItem = this.ItemContainerGenerator.ItemFromContainer((DependencyObject)Keyboard.FocusedElement); + this.SelectedItem = this.ItemContainerGenerator.ItemFromContainerOrContainerContent((DependencyObject)Keyboard.FocusedElement); } } } @@ -683,18 +683,18 @@ protected override void OnKeyDown(KeyEventArgs e) { if (this.Menu.IsKeyboardFocusWithin) { - Keyboard.Focus(this.ItemContainerGenerator.ContainerFromIndex(0) as IInputElement); + Keyboard.Focus(this.ItemContainerGenerator.ContainerOrContainerContentFromIndex(0)); } else { - Keyboard.Focus(this.Menu.ItemContainerGenerator.ContainerFromIndex(0) as IInputElement); + Keyboard.Focus(this.Menu.ItemContainerGenerator.ContainerOrContainerContentFromIndex(0)); } e.Handled = true; return; } - if (this.Menu.Items.Contains(this.Menu.ItemContainerGenerator.ItemFromContainer((DependencyObject)Keyboard.FocusedElement))) + if (this.Menu.Items.Contains(this.Menu.ItemContainerGenerator.ItemFromContainerOrContainerContent((DependencyObject)Keyboard.FocusedElement))) { if (e.Key == Key.Down) { @@ -702,11 +702,11 @@ protected override void OnKeyDown(KeyEventArgs e) if (indexOfMenuSelectedItem != this.Menu.Items.Count - 1) { - Keyboard.Focus(this.Menu.ItemContainerGenerator.ContainerFromIndex(indexOfMenuSelectedItem + 1) as IInputElement); + Keyboard.Focus(this.Menu.ItemContainerGenerator.ContainerOrContainerContentFromIndex(indexOfMenuSelectedItem + 1)); } else { - Keyboard.Focus(this.Menu.ItemContainerGenerator.ContainerFromIndex(0) as IInputElement); + Keyboard.Focus(this.Menu.ItemContainerGenerator.ContainerOrContainerContentFromIndex(0)); } e.Handled = true; @@ -719,11 +719,11 @@ protected override void OnKeyDown(KeyEventArgs e) if (indexOfMenuSelectedItem != 0) { - Keyboard.Focus(this.Menu.ItemContainerGenerator.ContainerFromIndex(indexOfMenuSelectedItem - 1) as IInputElement); + Keyboard.Focus(this.Menu.ItemContainerGenerator.ContainerOrContainerContentFromIndex(indexOfMenuSelectedItem - 1)); } else { - Keyboard.Focus(this.Menu.ItemContainerGenerator.ContainerFromIndex(this.Menu.Items.Count - 1) as IInputElement); + Keyboard.Focus(this.Menu.ItemContainerGenerator.ContainerOrContainerContentFromIndex(this.Menu.Items.Count - 1)); } e.Handled = true; diff --git a/Fluent.Ribbon/Controls/DropDownButton.cs b/Fluent.Ribbon/Controls/DropDownButton.cs index bb9c09021..9642935a2 100644 --- a/Fluent.Ribbon/Controls/DropDownButton.cs +++ b/Fluent.Ribbon/Controls/DropDownButton.cs @@ -15,7 +15,7 @@ namespace Fluent using System.Windows.Markup; using System.Windows.Threading; using Fluent.Extensions; - using Fluent.Internal; + using Fluent.Helpers; using Fluent.Internal.KnownBoxes; /// diff --git a/Fluent.Ribbon/Controls/Gallery.cs b/Fluent.Ribbon/Controls/Gallery.cs index 6fcd74f3d..98c713ad1 100644 --- a/Fluent.Ribbon/Controls/Gallery.cs +++ b/Fluent.Ribbon/Controls/Gallery.cs @@ -9,6 +9,7 @@ namespace Fluent using System.Windows.Controls; using System.Windows.Input; using System.Windows.Markup; + using Fluent.Extensions; using Fluent.Internal.KnownBoxes; /// @@ -467,7 +468,7 @@ private static object CoerceSelectedItem(DependencyObject d, object basevalue) if (gallery.Selectable == false) { - var galleryItem = (GalleryItem)gallery.ItemContainerGenerator.ContainerFromItem(basevalue); + var galleryItem = gallery.ItemContainerGenerator.ContainerOrContainerContentFromItem(basevalue); if (basevalue != null && galleryItem != null) diff --git a/Fluent.Ribbon/Controls/GalleryGroupContainer.cs b/Fluent.Ribbon/Controls/GalleryGroupContainer.cs index 1e9599930..d579292e5 100644 --- a/Fluent.Ribbon/Controls/GalleryGroupContainer.cs +++ b/Fluent.Ribbon/Controls/GalleryGroupContainer.cs @@ -6,6 +6,7 @@ namespace Fluent using System.Windows; using System.Windows.Controls; using System.Windows.Media; + using Fluent.Extensions; using Fluent.Internal; using Fluent.Internal.KnownBoxes; @@ -299,7 +300,7 @@ public Size GetItemSize() return Size.Empty; } - var anItem = this.ItemContainerGenerator.ContainerFromItem(this.Items[0]) as UIElement; + var anItem = this.ItemContainerGenerator.ContainerOrContainerContentFromItem(this.Items[0]); if (anItem == null) { return Size.Empty; diff --git a/Fluent.Ribbon/Controls/GalleryItem.cs b/Fluent.Ribbon/Controls/GalleryItem.cs index 9ddc01217..108d4ad63 100644 --- a/Fluent.Ribbon/Controls/GalleryItem.cs +++ b/Fluent.Ribbon/Controls/GalleryItem.cs @@ -8,6 +8,7 @@ namespace Fluent using System.Windows.Controls.Primitives; using System.Windows.Input; using Fluent.Extensions; + using Fluent.Helpers; using Fluent.Internal; using Fluent.Internal.KnownBoxes; @@ -302,9 +303,9 @@ private static void OnIsSelectedChanged(DependencyObject d, DependencyPropertyCh { ((GalleryItem)d).BringIntoView(); - if (ItemsControl.ItemsControlFromItemContainer(d) is Selector parentSelector) + if (ItemsControlHelper.ItemsControlFromItemContainer(d) is Selector parentSelector) { - var item = parentSelector.ItemContainerGenerator.ItemFromContainer(d); + var item = parentSelector.ItemContainerGenerator.ItemFromContainerOrContainerContent(d); if (ReferenceEquals(parentSelector.SelectedItem, item) == false) { diff --git a/Fluent.Ribbon/Controls/GalleryPanel.cs b/Fluent.Ribbon/Controls/GalleryPanel.cs index 34847ed99..d560223b4 100644 --- a/Fluent.Ribbon/Controls/GalleryPanel.cs +++ b/Fluent.Ribbon/Controls/GalleryPanel.cs @@ -431,18 +431,18 @@ private void Refresh() // Resolve group name string propertyValue = null; - + if (this.GroupByAdvanced != null) { propertyValue = this.ItemContainerGenerator == null - ? this.GroupByAdvanced(item) - : this.GroupByAdvanced(this.ItemContainerGenerator.ItemFromContainer(item)); + ? this.GroupByAdvanced(item) + : this.GroupByAdvanced(this.ItemContainerGenerator.ItemFromContainerOrContainerContent(item)); } else if (string.IsNullOrEmpty(this.GroupBy) == false) { propertyValue = this.ItemContainerGenerator == null - ? this.GetPropertyValueAsString(item) - : this.GetPropertyValueAsString(this.ItemContainerGenerator.ItemFromContainer(item)); + ? this.GetPropertyValueAsString(item) + : this.GetPropertyValueAsString(this.ItemContainerGenerator.ItemFromContainerOrContainerContent(item)); } if (propertyValue == null) diff --git a/Fluent.Ribbon/Controls/InRibbonGallery.cs b/Fluent.Ribbon/Controls/InRibbonGallery.cs index 884934209..c13ae90c2 100644 --- a/Fluent.Ribbon/Controls/InRibbonGallery.cs +++ b/Fluent.Ribbon/Controls/InRibbonGallery.cs @@ -1,4 +1,4 @@ -// ReSharper disable once CheckNamespace +// ReSharper disable once CheckNamespace namespace Fluent { using System; @@ -18,6 +18,7 @@ namespace Fluent using System.Windows.Threading; using Fluent.Extensibility; using Fluent.Extensions; + using Fluent.Helpers; using Fluent.Internal; using Fluent.Internal.KnownBoxes; using JetBrains.Annotations; @@ -939,7 +940,7 @@ private static object CoerceSelectedItem(DependencyObject d, object basevalue) if (gallery.Selectable == false) { - var galleryItem = (GalleryItem)gallery.ItemContainerGenerator.ContainerFromItem(basevalue); + var galleryItem = gallery.ItemContainerGenerator.ContainerOrContainerContentFromItem(basevalue); if (basevalue != null && galleryItem != null) { @@ -991,7 +992,7 @@ protected override void OnSelectionChanged(SelectionChangedEventArgs e) { foreach (var item in e.RemovedItems) { - if (this.ItemContainerGenerator.ContainerFromItem(item) is GalleryItem itemContainer) + if (this.ItemContainerGenerator.ContainerOrContainerContentFromItem(item) is GalleryItem itemContainer) { itemContainer.IsSelected = false; } @@ -999,7 +1000,7 @@ protected override void OnSelectionChanged(SelectionChangedEventArgs e) foreach (var item in e.AddedItems) { - if (this.ItemContainerGenerator.ContainerFromItem(item) is GalleryItem itemContainer) + if (this.ItemContainerGenerator.ContainerOrContainerContentFromItem(item) is GalleryItem itemContainer) { itemContainer.IsSelected = this.Selectable; } @@ -1206,7 +1207,7 @@ private void OnDropDownClosed(object sender, EventArgs e) this.galleryPanel.Height = double.NaN; } - var selectedContainer = this.ItemContainerGenerator.ContainerFromItem(this.SelectedItem) as GalleryItem; + var selectedContainer = this.ItemContainerGenerator.ContainerOrContainerContentFromItem(this.SelectedItem); selectedContainer?.BringIntoView(); }, DispatcherPriority.SystemIdle); } @@ -1532,7 +1533,7 @@ private void Unfreeze() this.IsSnapped = false; } - var selectedContainer = this.ItemContainerGenerator.ContainerFromItem(this.SelectedItem) as GalleryItem; + var selectedContainer = this.ItemContainerGenerator.ContainerOrContainerContentFromItem(this.SelectedItem); selectedContainer?.BringIntoView(); }, DispatcherPriority.SystemIdle); } diff --git a/Fluent.Ribbon/Controls/MenuItem.cs b/Fluent.Ribbon/Controls/MenuItem.cs index 303f19616..57faca02d 100644 --- a/Fluent.Ribbon/Controls/MenuItem.cs +++ b/Fluent.Ribbon/Controls/MenuItem.cs @@ -11,6 +11,7 @@ namespace Fluent using System.Windows.Media; using System.Windows.Threading; using Fluent.Extensions; + using Fluent.Helpers; using Fluent.Internal; using Fluent.Internal.KnownBoxes; @@ -39,7 +40,7 @@ public class MenuItem : System.Windows.Controls.MenuItem, IQuickAccessItemProvid #region Properties - private bool IsItemsControlMenuBase => (ItemsControlFromItemContainer(this) ?? VisualTreeHelper.GetParent(this)) is MenuBase; + private bool IsItemsControlMenuBase => (ItemsControlHelper.ItemsControlFromItemContainer(this) ?? VisualTreeHelper.GetParent(this)) is MenuBase; #region Size diff --git a/Fluent.Ribbon/Controls/RibbonGroupBox.cs b/Fluent.Ribbon/Controls/RibbonGroupBox.cs index 89d59aeb4..0b3226499 100644 --- a/Fluent.Ribbon/Controls/RibbonGroupBox.cs +++ b/Fluent.Ribbon/Controls/RibbonGroupBox.cs @@ -15,6 +15,7 @@ namespace Fluent using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Shapes; + using Fluent.Extensions; using Fluent.Internal; using Fluent.Internal.KnownBoxes; @@ -219,17 +220,10 @@ private void ScaleScaleableItems(ScaleDirection scaleDirection) { foreach (var item in this.Items) { - var element = this.ItemContainerGenerator.ContainerFromItem(item); + var scalableRibbonControl = this.ItemContainerGenerator.ContainerOrContainerContentFromItem(item); - if (element is null - || (element is UIElement uiElement && uiElement.Visibility != Visibility.Visible)) - { - continue; - } - - var scalableRibbonControl = element as IScalableRibbonControl; - - if (scalableRibbonControl is null) + if (scalableRibbonControl is null + || (scalableRibbonControl is UIElement uiElement && uiElement.Visibility != Visibility.Visible)) { continue; } @@ -261,9 +255,7 @@ private void UpdateScalableControlSubscritions(bool registerEvents) { foreach (var item in this.Items) { - var element = this.ItemContainerGenerator.ContainerFromItem(item); - - var scalableRibbonControl = element as IScalableRibbonControl; + var scalableRibbonControl = this.ItemContainerGenerator.ContainerOrContainerContentFromItem(item); if (scalableRibbonControl is null) { diff --git a/Fluent.Ribbon/Controls/RibbonTabControl.cs b/Fluent.Ribbon/Controls/RibbonTabControl.cs index 22bd42f1c..21d69a7d4 100644 --- a/Fluent.Ribbon/Controls/RibbonTabControl.cs +++ b/Fluent.Ribbon/Controls/RibbonTabControl.cs @@ -14,6 +14,7 @@ namespace Fluent using System.Windows.Input; using ControlzEx.Standard; using Fluent.Automation.Peers; + using Fluent.Extensions; using Fluent.Internal; using Fluent.Internal.KnownBoxes; @@ -706,7 +707,7 @@ private RibbonTabItem GetSelectedTabItem() } var item = selectedItem as RibbonTabItem - ?? this.ItemContainerGenerator.ContainerFromIndex(this.SelectedIndex) as RibbonTabItem; + ?? this.ItemContainerGenerator.ContainerOrContainerContentFromIndex(this.SelectedIndex); return item; } @@ -730,7 +731,7 @@ private RibbonTabItem FindNextTabItem(int startIndex, int direction) index = this.Items.Count - 1; } - if (this.ItemContainerGenerator.ContainerFromIndex(index) is RibbonTabItem nextItem + if (this.ItemContainerGenerator.ContainerOrContainerContentFromIndex(index) is RibbonTabItem nextItem && nextItem.IsEnabled && nextItem.Visibility == Visibility.Visible) { @@ -961,7 +962,7 @@ public object GetFirstVisibleItem() { foreach (var item in this.Items) { - if ((this.ItemContainerGenerator.ContainerFromItem(item) ?? item) is RibbonTabItem ribbonTab + if ((this.ItemContainerGenerator.ContainerOrContainerContentFromItem(item) ?? item) is RibbonTabItem ribbonTab && ribbonTab.Visibility == Visibility.Visible) { return ribbonTab; @@ -978,7 +979,7 @@ public object GetFirstVisibleAndEnabledItem() { foreach (var item in this.Items) { - if ((this.ItemContainerGenerator.ContainerFromItem(item) ?? item) is RibbonTabItem ribbonTab + if ((this.ItemContainerGenerator.ContainerOrContainerContentFromItem(item) ?? item) is RibbonTabItem ribbonTab && ribbonTab.Visibility == Visibility.Visible && ribbonTab.IsEnabled) { diff --git a/Fluent.Ribbon/Controls/RibbonTabItem.cs b/Fluent.Ribbon/Controls/RibbonTabItem.cs index a80826d65..df783df22 100644 --- a/Fluent.Ribbon/Controls/RibbonTabItem.cs +++ b/Fluent.Ribbon/Controls/RibbonTabItem.cs @@ -740,7 +740,7 @@ protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e) { if (this.TabControlParent != null) { - var newItem = this.TabControlParent.ItemContainerGenerator.ItemFromContainer(this); + var newItem = this.TabControlParent.ItemContainerGenerator.ItemFromContainerOrContainerContent(this); if (ReferenceEquals(this.TabControlParent.SelectedItem, newItem)) { diff --git a/Fluent.Ribbon/Extensions/ItemContainerGeneratorExtensions.cs b/Fluent.Ribbon/Extensions/ItemContainerGeneratorExtensions.cs new file mode 100644 index 000000000..ad9652e9c --- /dev/null +++ b/Fluent.Ribbon/Extensions/ItemContainerGeneratorExtensions.cs @@ -0,0 +1,107 @@ +namespace Fluent.Extensions +{ + using System.Runtime.Serialization; + using System.Windows; + using System.Windows.Controls; + using System.Windows.Media; + + /// + /// Extension-Methods for . + /// + public static class ItemContainerGeneratorExtensions + { + /// + /// Returns the container or the content of the container. + /// + /// + /// The container for if the container is of type . + /// The container content for if the container content is of type , but the container itself is not of type . + /// + public static TContainerOrContent ContainerOrContainerContentFromItem(this ItemContainerGenerator @this, object item) + where TContainerOrContent : class + { + var container = @this.ContainerFromItem(item) as TContainerOrContent; + + if (!(container is null)) + { + return container; + } + + var contentPresenterFromContainer = @this.ContainerFromItem(item) as ContentPresenter; + if (!(contentPresenterFromContainer is null) + && VisualTreeHelper.GetChildrenCount(contentPresenterFromContainer) > 0) + { + return VisualTreeHelper.GetChild(contentPresenterFromContainer, 0) as TContainerOrContent; + } + + return null; + } + + /// + /// Returns the container or the content of the container. + /// + /// + /// The container for if the container is of type . + /// The container content for if the container content is of type , but the container itself is not of type . + /// + public static TContainerOrContent ContainerOrContainerContentFromIndex(this ItemContainerGenerator @this, int index) + where TContainerOrContent : class + { + var container = @this.ContainerFromIndex(index) as TContainerOrContent; + + if (!(container is null)) + { + return container; + } + + var contentPresenterFromContainer = @this.ContainerFromIndex(index) as ContentPresenter; + if (!(contentPresenterFromContainer is null) + && VisualTreeHelper.GetChildrenCount(contentPresenterFromContainer) > 0) + { + return VisualTreeHelper.GetChild(contentPresenterFromContainer, 0) as TContainerOrContent; + } + + return null; + } + + /// + /// asdf + /// + /// + public static object ItemFromContainerOrContainerContent(this ItemContainerGenerator @this, DependencyObject container) + { + if (container is null) + { + return null; + } + + var item = @this.ItemFromContainer(container); + + if (!(item is null) + && item != DependencyProperty.UnsetValue) + { + return item; + } + + var visualParent = VisualTreeHelper.GetParent(container); + if (!(visualParent is null)) + { + item = @this.ItemFromContainer(visualParent); + } + + if (!(item is null) + && item != DependencyProperty.UnsetValue) + { + return item; + } + + if (container is FrameworkElement frameworkElement + && frameworkElement.Parent != null) + { + item = @this.ItemFromContainer(frameworkElement.Parent); + } + + return item; + } + } +} \ No newline at end of file diff --git a/Fluent.Ribbon/Helpers/ItemsControlHelper.cs b/Fluent.Ribbon/Helpers/ItemsControlHelper.cs new file mode 100644 index 000000000..7458c3924 --- /dev/null +++ b/Fluent.Ribbon/Helpers/ItemsControlHelper.cs @@ -0,0 +1,63 @@ +namespace Fluent.Helpers +{ + using System.Windows; + using System.Windows.Controls; + using System.Windows.Media; + + internal static class ItemsControlHelper + { + public static ItemsControl ItemsControlFromItemContainer(DependencyObject container) + { + if (container is null) + { + return null; + } + + var itemsControl = ItemsControl.ItemsControlFromItemContainer(container); + + if (!(itemsControl is null) + && itemsControl != DependencyProperty.UnsetValue) + { + return itemsControl; + } + + var visualParent = VisualTreeHelper.GetParent(container); + if (!(visualParent is null)) + { + itemsControl = ItemsControl.ItemsControlFromItemContainer(visualParent); + } + + if (!(itemsControl is null) + && itemsControl != DependencyProperty.UnsetValue) + { + return itemsControl; + } + + if (container is FrameworkElement frameworkElement + && frameworkElement.Parent != null) + { + itemsControl = ItemsControl.ItemsControlFromItemContainer(frameworkElement.Parent); + } + + return itemsControl; + } + + public static void MoveItemsToDifferentControl(ItemsControl source, ItemsControl target) + { + if (source.ItemsSource != null) + { + target.ItemsSource = source.ItemsSource; + source.ItemsSource = null; + } + else + { + while (source.Items.Count > 0) + { + var item = source.Items[0]; + source.Items.Remove(item); + target.Items.Add(item); + } + } + } + } +} \ No newline at end of file diff --git a/Fluent.Ribbon/Internal/ItemsControlHelper.cs b/Fluent.Ribbon/Internal/ItemsControlHelper.cs deleted file mode 100644 index 145a916f4..000000000 --- a/Fluent.Ribbon/Internal/ItemsControlHelper.cs +++ /dev/null @@ -1,25 +0,0 @@ -namespace Fluent.Internal -{ - using System.Windows.Controls; - - internal static class ItemsControlHelper - { - public static void MoveItemsToDifferentControl(ItemsControl source, ItemsControl target) - { - if (source.ItemsSource != null) - { - target.ItemsSource = source.ItemsSource; - source.ItemsSource = null; - } - else - { - while (source.Items.Count > 0) - { - var item = source.Items[0]; - source.Items.Remove(item); - target.Items.Add(item); - } - } - } - } -} \ No newline at end of file