diff options
author | E.Z. Hart <hartez@users.noreply.github.com> | 2016-12-02 13:48:42 -0700 |
---|---|---|
committer | Rui Marinho <me@ruimarinho.net> | 2016-12-02 20:48:42 +0000 |
commit | 4df66d139f8128486b3e34e1c206413abd1babd5 (patch) | |
tree | 3a7e1581240872ce3fff0559524cc6092d45014f /Xamarin.Forms.Platform.UAP/FormsCommandBar.cs | |
parent | badc701871a1190d6acb3495d3cefa93cff810c5 (diff) | |
download | xamarin-forms-4df66d139f8128486b3e34e1c206413abd1babd5.tar.gz xamarin-forms-4df66d139f8128486b3e34e1c206413abd1babd5.tar.bz2 xamarin-forms-4df66d139f8128486b3e34e1c206413abd1babd5.zip |
Allow CommandBar to expand and show command labels (#594)
* Allow CommandBar to expand and show command labels
Consolidate command bar placement code
* Make title text wrapping consistent between NavigationPage and MasterDetailPage
* Align toolbar/navigation bar behavior with other platforms
Diffstat (limited to 'Xamarin.Forms.Platform.UAP/FormsCommandBar.cs')
-rw-r--r-- | Xamarin.Forms.Platform.UAP/FormsCommandBar.cs | 79 |
1 files changed, 76 insertions, 3 deletions
diff --git a/Xamarin.Forms.Platform.UAP/FormsCommandBar.cs b/Xamarin.Forms.Platform.UAP/FormsCommandBar.cs index 21e9ca16..41451864 100644 --- a/Xamarin.Forms.Platform.UAP/FormsCommandBar.cs +++ b/Xamarin.Forms.Platform.UAP/FormsCommandBar.cs @@ -1,18 +1,30 @@ -using Windows.Foundation.Collections; +using System; +using Windows.Foundation.Collections; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; +using Windows.UI.Xaml.Data; namespace Xamarin.Forms.Platform.UWP { public class FormsCommandBar : CommandBar { - // TODO Once 10.0.14393.0 is available, enable dynamic overflow: https://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.commandbar.isdynamicoverflowenabled.aspx + // TODO Once 10.0.14393.0 is available (and we don't have to support lower versions), enable dynamic overflow: https://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.commandbar.isdynamicoverflowenabled.aspx + Windows.UI.Xaml.Controls.Button _moreButton; + public FormsCommandBar() { PrimaryCommands.VectorChanged += OnCommandsChanged; SecondaryCommands.VectorChanged += OnCommandsChanged; UpdateVisibility(); + WatchForContentChanges(); + } + + protected override void OnApplyTemplate() + { + base.OnApplyTemplate(); + + _moreButton = GetTemplateChild("MoreButton") as Windows.UI.Xaml.Controls.Button; } void OnCommandsChanged(IObservableVector<ICommandBarElement> sender, IVectorChangedEventArgs args) @@ -22,7 +34,68 @@ namespace Xamarin.Forms.Platform.UWP void UpdateVisibility() { - Visibility = PrimaryCommands.Count + SecondaryCommands.Count > 0 ? Visibility.Visible : Visibility.Collapsed; + var visibility = PrimaryCommands.Count + SecondaryCommands.Count > 0 ? Visibility.Visible : Visibility.Collapsed; + + if (_moreButton != null) + { + // The "..." button should only be visible if we have commands to display + _moreButton.Visibility = visibility; + + // There *is* an OverflowButtonVisibility property that does more or less the same thing, + // but it became available in 10.0.14393.0 and we have to support 10.0.10240 + } + + // If we have a title (or some other content) inside this command bar + // and that content is not collapsed + var frameworkElement = Content as FrameworkElement; + + // Temporarily tie the visibility of the toolbar to the visibility of the Title + // to be consistent with the old style / other platforms + if (frameworkElement != null && frameworkElement.Visibility == Visibility.Collapsed) + { + Visibility = Visibility.Collapsed; + return; + } + + if (frameworkElement != null && frameworkElement.Visibility != Visibility.Collapsed) + { + Visibility = Visibility.Visible; + } + else + { + // Otherwise, collapse it if there are no commands + Visibility = visibility; + } + } + + void WatchForContentChanges() + { + // If the content of the command bar changes while it's collapsed, we need to + // react and update the visibility (e.g., if the bar is placed at the bottom and + // has no commands, then is moved to the top and now includes the title) + + // There's no event on CommandBar when the content changes, so we'll bind our own + // dependency property to Content and update our visibility when it changes + var binding = new Windows.UI.Xaml.Data.Binding + { + Source = this, + Path = new PropertyPath(nameof(Content)), + Mode = Windows.UI.Xaml.Data.BindingMode.OneWay + }; + + BindingOperations.SetBinding(this, s_contentChangeWatcher, binding); + } + + static readonly DependencyProperty s_contentChangeWatcher = + DependencyProperty.Register( + "ContentChangeWatcher", + typeof(object), + typeof(object), + new PropertyMetadata(null, ContentChanged)); + + static void ContentChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + (d as FormsCommandBar)?.UpdateVisibility(); } } }
\ No newline at end of file |