Skip to content

Commit

Permalink
Implement Visibility property in ViewHandlers (dotnet#951)
Browse files Browse the repository at this point in the history
* Implement IsVisible property in ViewHandlers

* Fix the build error

* Fix build error

* Implement Visibility property

* Updated Windows implementation

* Actually trigger an update of the Visibility property with the handlers

* Move bool->Visibility converter into Controls

* Make new layouts Visibility-aware

* Handle Visibility.Collapsed for iOS

* Disambiguate MAUI Visibility and WinUI Visibility

* Set up example

* Fix rebase errors

* Fix rebase errors

* Fix xml comment

* Remove double mapping

* Reconcile ActivityIndicator Visibility with IsRunning property

* Fix iOS Visibility tests

Co-authored-by: E.Z. Hart <hartez@gmail.com>
Co-authored-by: Matthew Leibowitz <mattleibow@live.com>
  • Loading branch information
3 people authored and lytico committed May 19, 2021
1 parent 1cbaaef commit d1ff38c
Show file tree
Hide file tree
Showing 43 changed files with 490 additions and 104 deletions.
1 change: 1 addition & 0 deletions src/Compatibility/Core/src/Android/VisualElementTracker.cs
Original file line number Diff line number Diff line change
Expand Up @@ -332,6 +332,7 @@ void UpdateClip()
aView?.Invalidate();
}

[PortHandler]
void UpdateIsVisible()
{
VisualElement view = _renderer.Element;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
using UWPApp = Microsoft.UI.Xaml.Application;
using UWPControls = Microsoft.UI.Xaml.Controls;
using WScrollMode = Microsoft.UI.Xaml.Controls.ScrollMode;
using WVisibility = Microsoft.UI.Xaml.Visibility;

namespace Microsoft.Maui.Controls.Compatibility.Platform.UWP
{
Expand Down Expand Up @@ -41,11 +42,11 @@ public int Span

public static readonly DependencyProperty EmptyViewVisibilityProperty =
DependencyProperty.Register(nameof(EmptyViewVisibility), typeof(Visibility),
typeof(FormsGridView), new PropertyMetadata(Visibility.Collapsed));
typeof(FormsGridView), new PropertyMetadata(WVisibility.Collapsed));

public Visibility EmptyViewVisibility
public WVisibility EmptyViewVisibility
{
get { return (Visibility)GetValue(EmptyViewVisibilityProperty); }
get { return (WVisibility)GetValue(EmptyViewVisibilityProperty); }
set { SetValue(EmptyViewVisibilityProperty, value); }
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
using UwpApp = Microsoft.UI.Xaml.Application;
using UwpControlTemplate = Microsoft.UI.Xaml.Controls.ControlTemplate;
using UwpScrollBarVisibility = Microsoft.UI.Xaml.Controls.ScrollBarVisibility;
using WVisibility = Microsoft.UI.Xaml.Visibility;

namespace Microsoft.Maui.Controls.Compatibility.Platform.UWP
{
Expand All @@ -25,11 +26,11 @@ public FormsListView()

public static readonly DependencyProperty EmptyViewVisibilityProperty =
DependencyProperty.Register(nameof(EmptyViewVisibility), typeof(Visibility),
typeof(FormsListView), new PropertyMetadata(Visibility.Collapsed));
typeof(FormsListView), new PropertyMetadata(WVisibility.Collapsed));

public Visibility EmptyViewVisibility
public WVisibility EmptyViewVisibility
{
get { return (Visibility)GetValue(EmptyViewVisibilityProperty); }
get { return (WVisibility)GetValue(EmptyViewVisibilityProperty); }
set { SetValue(EmptyViewVisibilityProperty, value); }
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
using Microsoft.UI.Xaml;
using WVisibility = Microsoft.UI.Xaml.Visibility;

namespace Microsoft.Maui.Controls.Compatibility.Platform.UWP
{
internal interface IEmptyView
{
Visibility EmptyViewVisibility { get; set; }
WVisibility EmptyViewVisibility { get; set; }
void SetEmptyView(FrameworkElement emptyView, View formsEmptyView);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
using WRect = Windows.Foundation.Rect;
using Microsoft.Maui.Graphics;
using Microsoft.Maui.Controls.Platform;
using WVisibility = Microsoft.UI.Xaml.Visibility;

namespace Microsoft.Maui.Controls.Compatibility.Platform.UWP
{
Expand Down Expand Up @@ -472,7 +473,7 @@ protected virtual void UpdateEmptyViewVisibility()

if (_emptyView != null && ListViewBase is IEmptyView emptyView)
{
emptyView.EmptyViewVisibility = Visibility.Visible;
emptyView.EmptyViewVisibility = WVisibility.Visible;

if (ActualWidth >= 0 && ActualHeight >= 0)
_formsEmptyView?.Layout(new Rectangle(0, 0, ActualWidth, ActualHeight));
Expand All @@ -485,7 +486,7 @@ protected virtual void UpdateEmptyViewVisibility()
if (_emptyViewDisplayed)
{
if (_emptyView != null && ListViewBase is IEmptyView emptyView)
emptyView.EmptyViewVisibility = Visibility.Collapsed;
emptyView.EmptyViewVisibility = WVisibility.Collapsed;

ItemsView.RemoveLogicalChild(_formsEmptyView);
}
Expand Down Expand Up @@ -582,7 +583,7 @@ bool IsElementVisibleInContainer(FrameworkElement element, FrameworkElement cont
if (element == null || container == null)
return false;

if (element.Visibility != Visibility.Visible)
if (element.Visibility != WVisibility.Visible)
return false;

var elementBounds = element.TransformToVisual(container).TransformBounds(new WRect(0, 0, element.ActualWidth, element.ActualHeight));
Expand Down
37 changes: 19 additions & 18 deletions src/Compatibility/Core/src/WinUI/FlyoutPageControl.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
using Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific;
using WBrush = Microsoft.UI.Xaml.Media.Brush;
using WImageSource = Microsoft.UI.Xaml.Media.ImageSource;
using WVisibility = Microsoft.UI.Xaml.Visibility;

namespace Microsoft.Maui.Controls.Compatibility.Platform.UWP
{
Expand Down Expand Up @@ -82,7 +83,7 @@ public FlyoutPageControl()
{
DefaultStyleKey = typeof(FlyoutPageControl);

DetailTitleVisibility = Visibility.Collapsed;
DetailTitleVisibility = WVisibility.Collapsed;

CollapseStyle = CollapseStyle.Full;
}
Expand Down Expand Up @@ -133,9 +134,9 @@ public View DetailTitleView
set { SetValue(DetailTitleViewProperty, value); }
}

public Visibility DetailTitleVisibility
public WVisibility DetailTitleVisibility
{
get { return (Visibility)GetValue(DetailTitleVisibilityProperty); }
get { return (WVisibility)GetValue(DetailTitleVisibilityProperty); }
set { SetValue(DetailTitleVisibilityProperty, value); }
}

Expand Down Expand Up @@ -187,15 +188,15 @@ public string FlyoutTitle
set { SetValue(FlyoutTitleProperty, value); }
}

public Visibility FlyoutTitleVisibility
public WVisibility FlyoutTitleVisibility
{
get { return (Visibility)GetValue(FlyoutTitleVisibilityProperty); }
get { return (WVisibility)GetValue(FlyoutTitleVisibilityProperty); }
set { SetValue(FlyoutTitleVisibilityProperty, value); }
}

public Visibility FlyoutToolbarVisibility
public WVisibility FlyoutToolbarVisibility
{
get { return (Visibility)GetValue(FlyoutToolbarVisibilityProperty); }
get { return (WVisibility)GetValue(FlyoutToolbarVisibilityProperty); }
set { SetValue(FlyoutToolbarVisibilityProperty, value); }
}

Expand Down Expand Up @@ -231,9 +232,9 @@ public bool ToolbarDynamicOverflowEnabled
}
}

public Visibility ContentTogglePaneButtonVisibility
public WVisibility ContentTogglePaneButtonVisibility
{
get { return (Visibility)GetValue(ContentTogglePaneButtonVisibilityProperty); }
get { return (WVisibility)GetValue(ContentTogglePaneButtonVisibilityProperty); }
set { SetValue(ContentTogglePaneButtonVisibilityProperty, value); }
}

Expand Down Expand Up @@ -349,20 +350,20 @@ void UpdateMode()
{
// If we've determined that the pane will always be open, then there's no
// reason to display the show/hide pane button in the master
FlyoutToolbarVisibility = Visibility.Collapsed;
FlyoutToolbarVisibility = WVisibility.Collapsed;
}

// If we're in compact mode or the pane is always open,
// we don't need to display the content pane's toggle button
ContentTogglePaneButtonVisibility = _split.DisplayMode == SplitViewDisplayMode.Overlay
? Visibility.Visible
: Visibility.Collapsed;
? WVisibility.Visible
: WVisibility.Collapsed;

if (ContentTogglePaneButtonVisibility == Visibility.Visible)
DetailTitleVisibility = Visibility.Visible;
if (ContentTogglePaneButtonVisibility == WVisibility.Visible)
DetailTitleVisibility = WVisibility.Visible;

if (DetailTitleVisibility == Visibility.Visible && !ShouldShowNavigationBar)
DetailTitleVisibility = Visibility.Collapsed;
if (DetailTitleVisibility == WVisibility.Visible && !ShouldShowNavigationBar)
DetailTitleVisibility = WVisibility.Collapsed;

_firstLoad = true;
}
Expand Down Expand Up @@ -401,13 +402,13 @@ public string MasterTitle
set => FlyoutTitle = value;
}

public Visibility MasterTitleVisibility
public WVisibility MasterTitleVisibility
{
get => FlyoutTitleVisibility;
set => FlyoutTitleVisibility = value;
}

public Visibility MasterToolbarVisibility
public WVisibility MasterToolbarVisibility
{
get => FlyoutToolbarVisibility;
set => FlyoutToolbarVisibility = value;
Expand Down
3 changes: 2 additions & 1 deletion src/Compatibility/Core/src/WinUI/FlyoutPageRenderer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
using WImageSource = Microsoft.UI.Xaml.Media.ImageSource;
using Microsoft.Maui.Graphics;
using Microsoft.Maui.Controls.Platform;
using WVisibility = Microsoft.UI.Xaml.Visibility;

namespace Microsoft.Maui.Controls.Compatibility.Platform.UWP
{
Expand Down Expand Up @@ -76,7 +77,7 @@ bool ITitleProvider.ShowTitle
return;

_showTitle = value;
Control.DetailTitleVisibility = _showTitle ? Visibility.Visible : Visibility.Collapsed;
Control.DetailTitleVisibility = _showTitle ? WVisibility.Visible : WVisibility.Collapsed;
}
}

Expand Down
19 changes: 10 additions & 9 deletions src/Compatibility/Core/src/WinUI/FormsCommandBar.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
using Microsoft.UI.Xaml.Controls;
using Microsoft.UI.Xaml.Data;
using Microsoft.UI.Xaml.Media;
using WVisibility = Microsoft.UI.Xaml.Visibility;

namespace Microsoft.Maui.Controls.Compatibility.Platform.UWP
{
Expand Down Expand Up @@ -60,26 +61,26 @@ void UpdateVisibility()
{
// If there's no title to display (e.g., toolbarplacement is set to bottom)
// or the title is collapsed (e.g., because it's empty)
if (frameworkElement == null || frameworkElement.Visibility != Visibility.Visible)
if (frameworkElement == null || frameworkElement.Visibility != WVisibility.Visible)
{
// Just collapse the whole thing
Visibility = Visibility.Collapsed;
Visibility = WVisibility.Collapsed;
return;
}

// The title needs to be visible, but we're not allowed to show a toolbar
// So we need to hide the toolbar items

Visibility = Visibility.Visible;
Visibility = WVisibility.Visible;

if (_moreButton != null)
{
_moreButton.Visibility = Visibility.Collapsed;
_moreButton.Visibility = WVisibility.Collapsed;
}

if (_primaryItemsControl != null)
{
_primaryItemsControl.Visibility = Visibility.Collapsed;
_primaryItemsControl.Visibility = WVisibility.Collapsed;
}

return;
Expand All @@ -90,11 +91,11 @@ void UpdateVisibility()
if (_primaryItemsControl != null)
{
// This is normally visible by default, but it might have been collapsed by the toolbar consistency rules above
_primaryItemsControl.Visibility = Visibility.Visible;
_primaryItemsControl.Visibility = WVisibility.Visible;
}

// Are there any commands to display?
var visibility = PrimaryCommands.Count + SecondaryCommands.Count > 0 ? Visibility.Visible : Visibility.Collapsed;
var visibility = PrimaryCommands.Count + SecondaryCommands.Count > 0 ? WVisibility.Visible : WVisibility.Collapsed;

if (_moreButton != null)
{
Expand All @@ -105,10 +106,10 @@ void UpdateVisibility()
// but it became available in 10.0.14393.0 and we have to support 10.0.10240
}

if (frameworkElement != null && frameworkElement.Visibility != Visibility.Collapsed)
if (frameworkElement != null && frameworkElement.Visibility != WVisibility.Collapsed)
{
// If there's a title to display, we have to be visible whether or not we have commands
Visibility = Visibility.Visible;
Visibility = WVisibility.Visible;
}
else
{
Expand Down
5 changes: 3 additions & 2 deletions src/Compatibility/Core/src/WinUI/FormsFlyout.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
using Microsoft.Maui.Controls.Internals;
using WVisibility = Microsoft.UI.Xaml.Visibility;

namespace Microsoft.Maui.Controls.Compatibility.Platform.UWP
{
Expand Down Expand Up @@ -54,8 +55,8 @@ public FormsFlyout(ActionSheetArguments sheetOptions)
RightBtn.Content = options.Destruction;
}

LeftBtn.Visibility = LeftBtn.Content == null ? Visibility.Collapsed : Visibility.Visible;
RightBtn.Visibility = RightBtn.Content == null ? Visibility.Collapsed : Visibility.Visible;
LeftBtn.Visibility = LeftBtn.Content == null ? WVisibility.Collapsed : WVisibility.Visible;
RightBtn.Visibility = RightBtn.Content == null ? WVisibility.Collapsed : WVisibility.Visible;
}

void ListItemSelected (object sender, ItemClickEventArgs e)
Expand Down
9 changes: 5 additions & 4 deletions src/Compatibility/Core/src/WinUI/FormsSlider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
using Microsoft.UI.Xaml.Controls.Primitives;
using Microsoft.UI.Xaml.Media.Imaging;
using WImageSource = Microsoft.UI.Xaml.Media.ImageSource;
using WVisibility = Microsoft.UI.Xaml.Visibility;

namespace Microsoft.Maui.Controls.Compatibility.Platform.UWP
{
Expand Down Expand Up @@ -32,13 +33,13 @@ static void SwapThumbs(FormsSlider slider)

if (slider.ThumbImageSource != null)
{
slider.Thumb.Visibility = Visibility.Collapsed;
slider.ImageThumb.Visibility = Visibility.Visible;
slider.Thumb.Visibility = WVisibility.Collapsed;
slider.ImageThumb.Visibility = WVisibility.Visible;
}
else
{
slider.Thumb.Visibility = Visibility.Visible;
slider.ImageThumb.Visibility = Visibility.Collapsed;
slider.Thumb.Visibility = WVisibility.Visible;
slider.ImageThumb.Visibility = WVisibility.Collapsed;
}
}

Expand Down
5 changes: 3 additions & 2 deletions src/Compatibility/Core/src/WinUI/PageControl.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,13 @@
using Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific;
using WBrush = Microsoft.UI.Xaml.Media.Brush;
using WImageSource = Microsoft.UI.Xaml.Media.ImageSource;
using WVisibility = Microsoft.UI.Xaml.Visibility;

namespace Microsoft.Maui.Controls.Compatibility.Platform.UWP
{
public sealed class PageControl : ContentControl, IToolbarProvider, ITitleViewRendererController
{
public static readonly DependencyProperty TitleVisibilityProperty = DependencyProperty.Register(nameof(TitleVisibility), typeof(Visibility), typeof(PageControl), new PropertyMetadata(Visibility.Visible));
public static readonly DependencyProperty TitleVisibilityProperty = DependencyProperty.Register(nameof(TitleVisibility), typeof(WVisibility), typeof(PageControl), new PropertyMetadata(WVisibility.Visible));

public static readonly DependencyProperty ToolbarBackgroundProperty = DependencyProperty.Register(nameof(ToolbarBackground), typeof(WBrush), typeof(PageControl),
new PropertyMetadata(default(WBrush)));
Expand All @@ -23,7 +24,7 @@ public sealed class PageControl : ContentControl, IToolbarProvider, ITitleViewRe

public static readonly DependencyProperty TitleViewProperty = DependencyProperty.Register(nameof(TitleView), typeof(View), typeof(PageControl), new PropertyMetadata(default(View), OnTitleViewPropertyChanged));

public static readonly DependencyProperty TitleViewVisibilityProperty = DependencyProperty.Register(nameof(TitleViewVisibility), typeof(Visibility), typeof(PageControl), new PropertyMetadata(Visibility.Collapsed));
public static readonly DependencyProperty TitleViewVisibilityProperty = DependencyProperty.Register(nameof(TitleViewVisibility), typeof(WVisibility), typeof(PageControl), new PropertyMetadata(WVisibility.Collapsed));

public static readonly DependencyProperty TitleInsetProperty = DependencyProperty.Register("TitleInset", typeof(double), typeof(PageControl), new PropertyMetadata(default(double)));

Expand Down
5 changes: 3 additions & 2 deletions src/Compatibility/Core/src/WinUI/Platform.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
using WImage = Microsoft.UI.Xaml.Controls.Image;
using Microsoft.Maui.Graphics;
using Microsoft.Maui.Controls.Platform;
using WVisibility = Microsoft.UI.Xaml.Visibility;

namespace Microsoft.Maui.Controls.Compatibility.Platform.UWP
{
Expand Down Expand Up @@ -139,7 +140,7 @@ internal Platform(Microsoft.UI.Xaml.Window page)
MessagingCenter.Subscribe(this, Page.BusySetSignalName, (Page sender, bool enabled) =>
{
Microsoft.UI.Xaml.Controls.ProgressBar indicator = GetBusyIndicator();
indicator.Visibility = enabled ? Visibility.Visible : Visibility.Collapsed;
indicator.Visibility = enabled ? WVisibility.Visible : WVisibility.Collapsed;
});

_toolbarTracker.CollectionChanged += OnToolbarItemsChanged;
Expand Down Expand Up @@ -317,7 +318,7 @@ Microsoft.UI.Xaml.Controls.ProgressBar GetBusyIndicator()
_busyIndicator = new Microsoft.UI.Xaml.Controls.ProgressBar
{
IsIndeterminate = true,
Visibility = Visibility.Collapsed,
Visibility = WVisibility.Collapsed,
VerticalAlignment = UI.Xaml.VerticalAlignment.Top
};

Expand Down
Loading

0 comments on commit d1ff38c

Please sign in to comment.