File: Toolbar\Toolbar.Windows.cs
Web Access
Project: src\src\Controls\src\Core\Controls.Core.csproj (Microsoft.Maui.Controls)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using Microsoft.Maui.Controls.Platform;
using Microsoft.Maui.Graphics;
using Microsoft.UI.Xaml.Controls;
using NativeAutomationProperties = Microsoft.UI.Xaml.Automation.AutomationProperties;
using WImage = Microsoft.UI.Xaml.Controls.Image;
 
namespace Microsoft.Maui.Controls
{
	public partial class Toolbar
	{
		readonly ImageConverter _imageConverter = new ImageConverter();
		readonly ImageSourceIconElementConverter _imageSourceIconElementConverter = new ImageSourceIconElementConverter();
 
		NavigationRootManager? NavigationRootManager =>
			MauiContext?.GetNavigationRootManager();
 
		partial void OnHandlerChanging(IElementHandler oldHandler, IElementHandler newHandler)
		{
			if (newHandler == null)
			{
				foreach (var item in ToolbarItems)
					item.PropertyChanged -= OnToolbarItemPropertyChanged;
			}
		}
 
		internal void UpdateMenu()
		{
			if (Handler.PlatformView is not MauiToolbar wh)
				return;
 
			var commandBar = wh.CommandBar;
			if (commandBar == null)
			{
				return;
			}
 
			commandBar.PrimaryCommands.Clear();
			commandBar.SecondaryCommands.Clear();
 
			List<ToolbarItem> toolbarItems = new List<ToolbarItem>(ToolbarItems ?? Array.Empty<ToolbarItem>());
 
			foreach (ToolbarItem item in toolbarItems)
			{
				var button = new AppBarButton();
				button.SetBinding(AppBarButton.LabelProperty, "Text");
 
				if (commandBar.IsDynamicOverflowEnabled && item.Order == ToolbarItemOrder.Secondary)
				{
					button.SetBinding(AppBarButton.IconProperty, "IconImageSource", _imageSourceIconElementConverter);
				}
				else if (!item.IconImageSource.IsNullOrEmpty())
				{
					var img = new WImage();
					img.SetBinding(WImage.SourceProperty, "Value");
					img.SetBinding(WImage.DataContextProperty, "IconImageSource", _imageConverter);
					button.Content = img;
				}
 
				button.Command = new MenuItemCommand(item);
				button.DataContext = item;
				button.SetValue(NativeAutomationProperties.AutomationIdProperty, item.AutomationId);
				button.SetAutomationPropertiesName(item);
				button.SetAutomationPropertiesAccessibilityView(item);
				button.SetAutomationPropertiesHelpText(item);
				button.UpdateTextColor(BarTextColor);
 
				button.SetAutomationPropertiesLabeledBy(item, null);
 
				ToolbarItemOrder order = item.Order == ToolbarItemOrder.Default ? ToolbarItemOrder.Primary : item.Order;
				if (order == ToolbarItemOrder.Primary)
				{
					commandBar.PrimaryCommands.Add(button);
				}
				else
				{
					commandBar.SecondaryCommands.Add(button);
				}
 
				item.PropertyChanged -= OnToolbarItemPropertyChanged;
				item.PropertyChanged += OnToolbarItemPropertyChanged;
			}
 
			SetDefaultLabelPosition(commandBar, toolbarItems);
		}
 
		internal void OnToolbarItemPropertyChanged(object? sender, PropertyChangedEventArgs e)
		{
			if (Handler.PlatformView is not MauiToolbar wh)
				return;
 
			var commandBar = wh.CommandBar;
			if (commandBar == null)
			{
				return;
			}
 
			if (e.PropertyName == nameof(ToolbarItem.Text) || e.PropertyName == nameof(ToolbarItem.IconImageSource))
			{
				var toolbarItems = new List<ToolbarItem>(ToolbarItems ?? Array.Empty<ToolbarItem>());
				SetDefaultLabelPosition(commandBar, toolbarItems);
			}
		}
 
		private static void SetDefaultLabelPosition(CommandBar commandBar, IList<ToolbarItem> toolbarItems)
		{
			int itemsWithTextCount = 0;
			int itemsWithIconCount = 0;
 
			foreach (ToolbarItem item in toolbarItems)
			{
				if (!string.IsNullOrEmpty(item.Text))
				{
					itemsWithTextCount++;
				}
				if (item.IconImageSource != null)
				{
					itemsWithIconCount++;
				}
			}
 
			bool allItemsHaveIcons = toolbarItems.Count == itemsWithIconCount;
 
			// All items have icons, none have text
			if (allItemsHaveIcons && itemsWithTextCount == 0)
			{
				commandBar.DefaultLabelPosition = CommandBarDefaultLabelPosition.Collapsed;
			}
			else
			{
				commandBar.DefaultLabelPosition = CommandBarDefaultLabelPosition.Right;
			}
		}
 
		public static void MapBarTextColor(ToolbarHandler arg1, Toolbar arg2) =>
			MapBarTextColor((IToolbarHandler)arg1, arg2);
 
		public static void MapBarBackground(ToolbarHandler arg1, Toolbar arg2) =>
			MapBarBackground((IToolbarHandler)arg1, arg2);
 
		public static void MapBackButtonTitle(ToolbarHandler arg1, Toolbar arg2) =>
			MapBackButtonTitle((IToolbarHandler)arg1, arg2);
 
		public static void MapToolbarItems(ToolbarHandler arg1, Toolbar arg2) =>
			MapToolbarItems((IToolbarHandler)arg1, arg2);
 
		public static void MapIconColor(ToolbarHandler arg1, Toolbar arg2) =>
			MapIconColor((IToolbarHandler)arg1, arg2);
 
		public static void MapTitleView(ToolbarHandler arg1, Toolbar arg2) =>
			MapTitleView((IToolbarHandler)arg1, arg2);
 
		public static void MapTitleIcon(ToolbarHandler arg1, Toolbar arg2) =>
			MapTitleIcon((IToolbarHandler)arg1, arg2);
 
		public static void MapBackButtonVisible(ToolbarHandler arg1, Toolbar arg2) =>
			MapBackButtonVisible((IToolbarHandler)arg1, arg2);
 
		public static void MapIsVisible(ToolbarHandler arg1, Toolbar arg2) =>
			MapIsVisible((IToolbarHandler)arg1, arg2);
 
		public static void MapToolbarPlacement(ToolbarHandler arg1, Toolbar arg2) =>
			MapToolbarPlacement((IToolbarHandler)arg1, arg2);
 
		public static void MapToolbarDynamicOverflowEnabled(ToolbarHandler arg1, Toolbar arg2) =>
			MapToolbarDynamicOverflowEnabled((IToolbarHandler)arg1, arg2);
 
		public static void MapToolbarPlacement(IToolbarHandler arg1, Toolbar arg2)
		{
		}
 
		public static void MapToolbarDynamicOverflowEnabled(IToolbarHandler arg1, Toolbar arg2)
		{
			arg1.PlatformView.UpdateToolbarDynamicOverflowEnabled(arg2);
		}
 
		public static void MapBarTextColor(IToolbarHandler arg1, Toolbar arg2)
		{
			arg1.PlatformView.UpdateBarTextColor(arg2);
		}
 
		public static void MapBarBackground(IToolbarHandler arg1, Toolbar arg2)
		{
			arg1.PlatformView.UpdateBarBackground(arg2);
		}
 
		public static void MapBackButtonTitle(IToolbarHandler arg1, Toolbar arg2)
		{
			arg1.PlatformView.UpdateBackButton(arg2);
		}
 
		public static void MapToolbarItems(IToolbarHandler arg1, Toolbar arg2)
		{
			arg2.UpdateMenu();
		}
 
		public static void MapIconColor(IToolbarHandler arg1, Toolbar arg2)
		{
			arg1.PlatformView.UpdateIconColor(arg2);
		}
 
		public static void MapIcon(ToolbarHandler arg1, Toolbar arg2)
		{
		}
 
		public static void MapIcon(IToolbarHandler arg1, Toolbar arg2)
		{
		}
 
		public static void MapTitleView(IToolbarHandler arg1, Toolbar arg2)
		{
			arg1.PlatformView.UpdateTitleView(arg2);
		}
 
		public static void MapTitleIcon(IToolbarHandler arg1, Toolbar arg2)
		{
			arg1.PlatformView.UpdateTitleIcon(arg2);
		}
 
		public static void MapBackButtonVisible(IToolbarHandler arg1, Toolbar arg2)
		{
			arg1.PlatformView.UpdateBackButton(arg2);
		}
 
		public static void MapBackButtonEnabled(ToolbarHandler arg1, Toolbar arg2) =>
			MapBackButtonEnabled((IToolbarHandler)arg1, arg2);
 
 
		public static void MapBackButtonEnabled(IToolbarHandler arg1, Toolbar arg2)
		{
			arg1.PlatformView.UpdateBackButton(arg2);
		}
 
		public static void MapIsVisible(IToolbarHandler arg1, Toolbar arg2)
		{
			arg1.PlatformView.UpdateIsVisible(arg2);
		}
	}
}