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