xamarin / Xamarin.Forms

Xamarin.Forms is no longer supported. Migrate your apps to .NET MAUI.
https://aka.ms/xamarin-upgrade
Other
5.64k stars 1.88k forks source link

[Bug] Shell.NavBarIsVisible="False" freezes app in rare cases on iOS #14714

Open AndreasReitberger opened 2 years ago

AndreasReitberger commented 2 years ago

Description

I noticed a strange bug in my app, however I can't reproduce it surley.

I'm using Shell.NavBarIsVisible="False"

in a ContentPage. Depending from where in my app I call await Shell.Current.GoToAsync(MyPage); it works or not.

If I remove Shell.NavBarIsVisible="False" it works fine, no matter from where I call the Shell navigation. I also tried to call an empty page.

After figuering out that the navbar is the issue, I downgraded to 5.0.0.2083. There it's the same.

I can remember to update the Xamarin.Forms iOS SDK to 15.x recently. Maybe it's caused by this?

Expected Behavior

App doesn't freeze if set Shell.NavBarIsVisible="False"

Actual Behavior

Called from Dashboard (nested in a SfTabView) https://user-images.githubusercontent.com/2952443/136650097-2e512318-b472-4f19-9d73-921550bf7cec.MP4

Called from ControlPanel (nested in a Grid) https://user-images.githubusercontent.com/2952443/136650145-02f49d42-28d9-4192-b959-c792911b8e1c.MP4

Basic Information

Environment

Show/Hide Visual Studio info Microsoft Visual Studio Enterprise 2019 Version 16.11.4 VisualStudio.16.Release/16.11.4+31727.386 Microsoft .NET Framework Version 4.8.04084 Installed Version: Enterprise Visual C++ 2019 00433-90001-45691-AA433 Microsoft Visual C++ 2019 .NET Core Debugging with WSL 1.0 .NET Core Debugging with WSL ASP.NET and Web Tools 2019 16.11.75.64347 ASP.NET and Web Tools 2019 ASP.NET Web Frameworks and Tools 2019 16.11.75.64347 For additional information, visit https://www.asp.net/ Azure App Service Tools v3.0.0 16.11.75.64347 Azure App Service Tools v3.0.0 Azure Functions and Web Jobs Tools 16.11.75.64347 Azure Functions and Web Jobs Tools C# Tools 3.11.0-4.21403.6+ae1fff344d46976624e68ae17164e0607ab68b10 C# components used in the IDE. Depending on your project type and settings, a different version of the compiler may be used. Common Azure Tools 1.10 Provides common services for use by Azure Mobile Services and Microsoft Azure Tools. Extensibility Message Bus 1.2.6 (master@34d6af2) Provides common messaging-based MEF services for loosely coupled Visual Studio extension components communication and integration. IntelliCode Extension 1.0 IntelliCode Visual Studio Extension Detailed Info Microsoft Azure Tools for Visual Studio 2.9 Support for Azure Cloud Services projects Microsoft Continuous Delivery Tools for Visual Studio 0.4 Simplifying the configuration of Azure DevOps pipelines from within the Visual Studio IDE. Microsoft JVM Debugger 1.0 Provides support for connecting the Visual Studio debugger to JDWP compatible Java Virtual Machines Microsoft Library Manager 2.1.113+g422d40002e.RR Install client-side libraries easily to any web project Microsoft MI-Based Debugger 1.0 Provides support for connecting Visual Studio to MI compatible debuggers Microsoft Visual C++ Wizards 1.0 Microsoft Visual C++ Wizards Microsoft Visual Studio Tools for Containers 1.2 Develop, run, validate your ASP.NET Core applications in the target environment. F5 your application directly into a container with debugging, or CTRL + F5 to edit & refresh your app without having to rebuild the container. Microsoft Visual Studio VC Package 1.0 Microsoft Visual Studio VC Package Mono Debugging for Visual Studio 16.10.15 (552afdf) Support for debugging Mono processes with Visual Studio. NuGet Package Manager 5.11.0 NuGet Package Manager in Visual Studio. For more information about NuGet, visit https://docs.nuget.org/ ProjectServicesPackage Extension 1.0 ProjectServicesPackage Visual Studio Extension Detailed Info Razor (ASP.NET Core) 16.1.0.2122504+13c05c96ea6bdbe550bd88b0bf6cdddf8cde1725 Provides languages services for ASP.NET Core Razor. Snapshot Debugging Extension 1.0 Snapshot Debugging Visual Studio Extension Detailed Info SQL Server Data Tools 16.0.62107.28140 Microsoft SQL Server Data Tools TypeScript Tools 16.0.30526.2002 TypeScript Tools for Microsoft Visual Studio Visual Basic Tools 3.11.0-4.21403.6+ae1fff344d46976624e68ae17164e0607ab68b10 Visual Basic components used in the IDE. Depending on your project type and settings, a different version of the compiler may be used. Visual F# Tools 16.11.0-beta.21322.6+488cc578cafcd261d90d748d8aaa7b8b091232dc Microsoft Visual F# Tools Visual Studio Code Debug Adapter Host Package 1.0 Interop layer for hosting Visual Studio Code debug adapters in Visual Studio Visual Studio Container Tools Extensions 1.0 View, manage, and diagnose containers within Visual Studio. Visual Studio Tools for Containers 1.0 Visual Studio Tools for Containers VisualStudio.DeviceLog 1.0 Information about my package VisualStudio.Foo 1.0 Information about my package VisualStudio.Mac 1.0 Mac Extension for Visual Studio Xamarin 16.11.000.190 (d16-11@2391ed9) Visual Studio extension to enable development for Xamarin.iOS and Xamarin.Android. Xamarin Designer 16.11.0.17 (remotes/origin/11e0001f0b17269345e80b58fb3adf1ba4efe2cd@11e0001f0) Visual Studio extension to enable Xamarin Designer tools in Visual Studio. Xamarin Templates 16.10.5 (355b57a) Templates for building iOS, Android, and Windows apps with Xamarin and Xamarin.Forms. Xamarin.Android SDK 11.4.0.5 (d16-11/7776c9f) Xamarin.Android Reference Assemblies and MSBuild support. Mono: c633fe9 Java.Interop: xamarin/java.interop/d16-11@48766c0 ProGuard: Guardsquare/proguard/v7.0.1@912d149 SQLite: xamarin/sqlite/3.35.4@85460d3 Xamarin.Android Tools: xamarin/xamarin-android-tools/d16-11@683f375 Xamarin.iOS and Xamarin.Mac SDK 15.0.0.8 (0796d78dc) Xamarin.iOS and Xamarin.Mac Reference Assemblies and MSBuild support.

Build Logs

Workaround

Not set Shell.NavBarIsVisible="False" or disable animation on await Shell.Current.GoToAsync(MyPage, false);

AndreasReitberger commented 2 years ago

Ok, just figured out that it also starts to work if I set the animate parameter to false. await Shell.Current.GoToAsync(MyPage, false);

Hope this helps!

jfversluis commented 2 years ago

Would you maybe be able to try the nightly feed package? I know we made some fixes in this area, wondering if it might already be fixed :)

AndreasReitberger commented 2 years ago

Sure, I'll give it a try and report back 😊

AndreasReitberger commented 2 years ago

@jfversluis Just tried the latest nightly, but the issue is still there. However there is a difference now. Before, the animation started and the app freezed. Now, the app freezes directly when the navigation has started, no animation is shown at all. Also setting "animate: false" does not fix the problem anymore.

This is how I call the navigation.

_ = await ShellNavigationManager.Instance.GoToAsync(
                $"{ShellRoute.PrintServerViewWebCamPage}?id={SelectedWebCamIndex}", false, -1, true);

And this is the code of the ShellNavigationManager.

public async Task<bool> GoToAsync(string target, bool flyoutIsPresented = false, int delay = -1, bool animate = true)
        {
            try
            {
                Shell.Current.FlyoutIsPresented = flyoutIsPresented;
                if (delay != -1)
                    await Task.Delay(delay);
                // Workaround for #13510 - https://github.com/xamarin/Xamarin.Forms/issues/13510
                else if(Device.RuntimePlatform == "iOS")
                    await Task.Delay(50);

                await Device.InvokeOnMainThreadAsync(async () =>
                {
                    try
                    {
                        PreviousRoute = GetCurrentRoute();
                        await Shell.Current.GoToAsync(target, animate);
                    }
                    catch (Exception exc)
                    {
                        EventManager.LogError(exc);
                    }
                });
                return true;
            }
            catch (Exception exc)
            {
                // Log error
                EventManager.LogError(exc);
                return false;
            }
        }

Is it a problem to call the navigation on the MainThread?

Edit: I tried to debug it on single step. The app doesn't return from the Shell.Current.GoToAsync function.

PreviousRoute = GetCurrentRoute();
await Shell.Current.GoToAsync(target, animate); // <==== Stuck on there

And because it's called on the main thread, it freezes the app. So I tried to not call it on the main thread instead. But even then, the app freezes completely.

AndreasReitberger commented 2 years ago

I guess I figured out why this issue is happening on my end. On the page, from where I call the await Shell.Current.GoToAsync(target, animate); function has two different modes.

Depending, if it's a Tablet or Phone, either the tablet optimized XAML will be shown, or the phone optimized one. One is always invisible. Due to bad performance I now have decided to remove the phone mode and only go with the tablet mode. Once I've removed the XAML for the phone mode, the navigation started to work again. I attached the old code for the page.

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:d="http://xamarin.com/schemas/2014/forms/design"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             mc:Ignorable="d"
             x:Class="RemoteControlRepetierServer.Views.DashboardPage"

             xmlns:viewModels="clr-namespace:RemoteControlRepetierServer.ViewModels"
             xmlns:converters="clr-namespace:RemoteControlRepetierServer.Converters"            
             xmlns:localization="clr-namespace:RemoteControlRepetierServer.Resources.Localization"   
             xmlns:controls="clr-namespace:RemoteControlRepetierServer.Controls"

             xmlns:cards="clr-namespace:Syncfusion.XForms.Cards;assembly=Syncfusion.Cards.XForms"
             xmlns:buttons="clr-namespace:Syncfusion.XForms.Buttons;assembly=Syncfusion.Buttons.XForms"
             xmlns:PullToRefresh="clr-namespace:Syncfusion.SfPullToRefresh.XForms;assembly=Syncfusion.SfPullToRefresh.XForms"
             xmlns:listView="clr-namespace:Syncfusion.ListView.XForms;assembly=Syncfusion.SfListView.XForms"
             xmlns:data="clr-namespace:Syncfusion.DataSource;assembly=Syncfusion.DataSource.Portable"  
             xmlns:progressBar="clr-namespace:Syncfusion.XForms.ProgressBar;assembly=Syncfusion.SfProgressBar.XForms"
             xmlns:busyindicator="clr-namespace:Syncfusion.SfBusyIndicator.XForms;assembly=Syncfusion.SfBusyIndicator.XForms"
             xmlns:badge ="clr-namespace:Syncfusion.XForms.BadgeView;assembly=Syncfusion.SfBadgeView.XForms"
             xmlns:vlc="clr-namespace:LibVLCSharp.Forms.Shared;assembly=LibVLCSharp.Forms"
             xmlns:tabView="clr-namespace:Syncfusion.XForms.TabView;assembly=Syncfusion.SfTabView.XForms"
             xmlns:segmentCollection="clr-namespace:System.Collections.Generic;assembly=netstandard"
             xmlns:gauge="clr-namespace:Syncfusion.SfGauge.XForms;assembly=Syncfusion.SfGauge.XForms"
             xmlns:numeric="clr-namespace:Syncfusion.SfNumericUpDown.XForms;assembly=Syncfusion.SfNumericUpDown.XForms"
             xmlns:range="clr-namespace:Syncfusion.SfRangeSlider.XForms;assembly=Syncfusion.SfRangeSlider.XForms"
             xmlns:border="clr-namespace:Syncfusion.XForms.Border;assembly=Syncfusion.Core.XForms"
             xmlns:behaviors="clr-namespace:RemoteControlRepetierServer.Behaviors"

             x:Name="root"
             x:DataType="viewModels:DashboardViewModel"         
             >
    <ContentPage.Style>
        <Style TargetType="ContentPage" BasedOn="{StaticResource DefaultPageStyle}">
            <!-- <Setter Property="BackgroundColor" Value="{DynamicResource Gray-White}"/> -->
            <Style.Triggers>
                <MultiTrigger TargetType="ContentPage">
                    <MultiTrigger.Conditions>
                        <BindingCondition Binding="{Binding IsPortrait}" Value="False"/>
                        <BindingCondition Binding="{Binding ShowOnlyWebCamInLandscape}" Value="True"/>
                    </MultiTrigger.Conditions>
                    <Setter Property="BackgroundColor" Value="{DynamicResource Black}"/>
                </MultiTrigger>
            </Style.Triggers>
        </Style>
    </ContentPage.Style>
    <ContentPage.BindingContext>
        <viewModels:DashboardViewModel x:Name="ViewModel" />
    </ContentPage.BindingContext>

    <ContentPage.Resources>
        <converters:BooleanVisibilityConverter x:Key="BooleanVisibilityConverter" />
        <converters:BooleanReverseVisibilityConverter x:Key="BooleanReverseVisibilityConverter" />
        <converters:RepetierDoubleHoursToTimeSpanConverter x:Key="RepetierDoubleHoursToTimeSpanConverter" />
        <converters:ByteArrayToImageConverter x:Key="ByteArrayToImageConverter" />
    </ContentPage.Resources>

    <Grid
        CompressedLayout.IsHeadless="true"
        >
        <!-- Phone Mode -->
        <PullToRefresh:SfPullToRefresh
            IsRefreshing="{Binding IsRefreshing}" 
            RefreshCommand="{Binding RefreshCommand}"
            IsVisible="{Binding IsTabletMode, Converter={StaticResource BooleanReverseVisibilityConverter}}"
            Style="{StaticResource DefaultPullToRefreshStyle}"
            >
            <PullToRefresh:SfPullToRefresh.PullableContent>
                <Grid 
                    x:Name="InnerGrid" 
                    ColumnSpacing="0" 
                    RowSpacing="0"
                    >
                    <!-- Style -->
                    <Grid.Style>
                        <Style TargetType="Grid">
                            <!-- Default -->
                            <Setter Property="Grid.RowDefinitions">
                                <Setter.Value>
                                    <RowDefinitionCollection>
                                        <RowDefinition Height="{OnIdiom Desktop=*, Tablet=2*, Phone=2*, Default=2*}"/>
                                        <RowDefinition Height="{OnIdiom Desktop=*, Tablet=3*, Phone=3*, Default=3*}"/>
                                    </RowDefinitionCollection>
                                </Setter.Value>
                            </Setter>
                            <Style.Triggers>
                                <!-- Portrait -->                                
                                <!-- If expanded while not printing -->
                                <MultiTrigger TargetType="Grid">
                                    <MultiTrigger.Conditions>
                                        <BindingCondition Binding="{Binding IsPortrait}" Value="True"/>
                                    </MultiTrigger.Conditions>
                                    <Setter Property="Grid.RowDefinitions">
                                        <Setter.Value>
                                            <RowDefinitionCollection>
                                                <RowDefinition Height="{OnIdiom Desktop=*, Tablet=2*, Phone=2*, Default=2*}"/>
                                                <RowDefinition Height="{OnIdiom Desktop=*, Tablet=3*, Phone=3*, Default=3*}"/>
                                            </RowDefinitionCollection>
                                        </Setter.Value>
                                    </Setter>
                                </MultiTrigger>
                                <!-- Landscape -->

                                <!-- If expanded while not printing -->
                                <MultiTrigger TargetType="Grid">
                                    <MultiTrigger.Conditions>
                                        <BindingCondition Binding="{Binding IsPortrait}" Value="False"/>
                                    </MultiTrigger.Conditions>
                                    <Setter Property="Grid.RowDefinitions">
                                        <Setter.Value>
                                            <RowDefinitionCollection>
                                                <RowDefinition Height="{OnIdiom Desktop=*, Tablet=0.2*, Phone=0.5*, Default=0.5*}"/>
                                                <RowDefinition Height="{OnIdiom Desktop=3*, Tablet=4*, Phone=3*, Default=3*}"/>
                                                <RowDefinition Height="{OnIdiom Desktop=*, Tablet=0.2*, Phone=0.5*, Default=0.5*}"/>
                                            </RowDefinitionCollection>
                                        </Setter.Value>
                                    </Setter>
                                </MultiTrigger>

                                <!-- Collapse / Expand TopView -->
                                <MultiTrigger TargetType="Grid">
                                    <MultiTrigger.Conditions>
                                        <BindingCondition Binding="{Binding IsPortrait}" Value="True"/>
                                        <BindingCondition Binding="{Binding ShowImage}" Value="True"/>
                                        <BindingCondition Binding="{Binding ExpandTopView}" Value="False"/>
                                    </MultiTrigger.Conditions>
                                    <Setter Property="Grid.RowDefinitions">
                                        <Setter.Value>
                                            <RowDefinitionCollection>
                                                <RowDefinition Height="{OnIdiom Desktop=*, Tablet=1*, Phone=0.5*, Default=0.5*}"/>
                                                <RowDefinition Height="{OnIdiom Desktop=*, Tablet=3*, Phone=3*, Default=3*}"/>
                                            </RowDefinitionCollection>
                                        </Setter.Value>
                                    </Setter>
                                </MultiTrigger>
                            </Style.Triggers>
                        </Style>
                    </Grid.Style>

                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="{OnIdiom Desktop=1*, Tablet=0.2*, Phone=2, Default=2}" />
                        <ColumnDefinition Width="{OnIdiom Desktop=3*, Tablet=4*, Phone=*, Default=*}" />
                        <ColumnDefinition Width="{OnIdiom Desktop=1*, Tablet=0.2*, Phone=2, Default=2}" />
                    </Grid.ColumnDefinitions>

                    <!-- TopView -->
                    <Grid 
                        x:Name="TopViewGrid"
                        BackgroundColor="{DynamicResource GradientStart}"
                        >

                        <Grid.Style>
                            <Style TargetType="Grid">
                                <!-- Portrait -->
                                <Setter Property="IsVisible" Value="True"/>
                                <Setter Property="Grid.Row" Value="0"/>
                                <Setter Property="Grid.Column" Value="0"/>
                                <Setter Property="Grid.ColumnSpan" Value="3"/>
                                <Style.Triggers>
                                    <!-- Landscape -->
                                    <MultiTrigger TargetType="Grid">
                                        <MultiTrigger.Conditions>
                                            <BindingCondition Binding="{Binding IsPortrait}" Value="False"/>
                                            <BindingCondition Binding="{Binding ShowOnlyWebCamInLandscape}" Value="False"/>
                                        </MultiTrigger.Conditions>
                                        <Setter Property="Grid.Row" Value="1"/>
                                        <Setter Property="Grid.Column" Value="0"/>
                                        <Setter Property="Grid.ColumnSpan" Value="1"/>
                                    </MultiTrigger>
                                    <MultiTrigger TargetType="Grid">
                                        <MultiTrigger.Conditions>
                                            <BindingCondition Binding="{Binding IsPortrait}" Value="False"/>
                                            <BindingCondition Binding="{Binding ShowOnlyWebCamInLandscape}" Value="True"/>
                                        </MultiTrigger.Conditions>
                                        <Setter Property="Grid.Row" Value="0"/>
                                        <Setter Property="Grid.RowSpan" Value="3"/>
                                        <Setter Property="Grid.Column" Value="0"/>
                                        <Setter Property="Grid.ColumnSpan" Value="3"/>
                                    </MultiTrigger>
                                    <!-- Visibility -->
                                    <!-- Hide while printing if set in option -->
                                    <MultiTrigger TargetType="Grid">
                                        <MultiTrigger.Conditions>
                                            <BindingCondition Binding="{Binding IsPrinting}" Value="False"/>
                                            <BindingCondition Binding="{Binding CollapseTopViewWhileNotPrinting}" Value="True"/>
                                        </MultiTrigger.Conditions>
                                        <Setter Property="IsVisible" Value="False"/>
                                    </MultiTrigger>
                                </Style.Triggers>
                            </Style>
                        </Grid.Style>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="{OnIdiom Phone=92, Tablet=112, Default=92}"/>
                            <ColumnDefinition Width="*"/>
                            <ColumnDefinition Width="{OnIdiom Phone=92, Tablet=112, Default=92}"/>
                        </Grid.ColumnDefinitions>
                        <Grid.RowDefinitions>
                            <RowDefinition />
                            <RowDefinition Height="Auto"/>
                        </Grid.RowDefinitions>

                    </Grid>

                    <!-- Content -->
                    <!-- BackgroundColor="{DynamicResource Gray-White}" -->
                    <Grid 
                        x:Name="ContentGrid" 
                        RowSpacing="0"
                        BackgroundColor="{DynamicResource Gray-White}"
                        >
                        <Grid.Style>
                            <Style TargetType="Grid">
                                <!-- Portrait -->
                                <Setter Property="Grid.Row" Value="1"/>
                                <Setter Property="Grid.Column" Value="0"/>
                                <Setter Property="Grid.ColumnSpan" Value="3"/>
                                <Setter Property="IsEnabled" Value="True"/>
                                <Setter Property="IsVisible" Value="True"/>
                                <Style.Triggers>
                                    <!-- Landscape -->
                                    <MultiTrigger TargetType="Grid">
                                        <MultiTrigger.Conditions>
                                            <BindingCondition Binding="{Binding IsPortrait}" Value="False"/>
                                            <BindingCondition Binding="{Binding ShowOnlyWebCamInLandscape}" Value="False"/>
                                        </MultiTrigger.Conditions>
                                        <Setter Property="Grid.Row" Value="1"/>
                                        <Setter Property="Grid.Column" Value="2"/>
                                        <Setter Property="Grid.ColumnSpan" Value="1"/>
                                        <Setter Property="IsEnabled" Value="True"/>
                                        <Setter Property="IsVisible" Value="True"/>
                                    </MultiTrigger>
                                    <MultiTrigger TargetType="Grid">
                                        <MultiTrigger.Conditions>
                                            <BindingCondition Binding="{Binding IsPortrait}" Value="False"/>
                                            <BindingCondition Binding="{Binding ShowOnlyWebCamInLandscape}" Value="True"/>
                                        </MultiTrigger.Conditions>
                                        <Setter Property="Grid.Row" Value="1"/>
                                        <Setter Property="Grid.Column" Value="2"/>
                                        <Setter Property="Grid.ColumnSpan" Value="1"/>
                                        <Setter Property="IsEnabled" Value="False"/>
                                        <Setter Property="IsVisible" Value="False"/>
                                    </MultiTrigger>
                                </Style.Triggers>
                            </Style>
                        </Grid.Style>

                    </Grid>

                    <!-- TopView - Button Overlay-->
                    <Grid 
                        x:Name="TopViewOverlayGrid"

                        >
                        <Grid.Style>
                            <Style TargetType="Grid">
                                <!-- Portrait -->
                                <Setter Property="IsVisible" Value="True"/>
                                <Setter Property="Grid.Row" Value="0"/>
                                <Setter Property="Grid.Column" Value="0"/>
                                <Setter Property="Grid.ColumnSpan" Value="3"/>
                                <Style.Triggers>
                                    <!-- Landscape -->
                                    <MultiTrigger TargetType="Grid">
                                        <MultiTrigger.Conditions>
                                            <BindingCondition Binding="{Binding IsPortrait}" Value="False"/>
                                            <BindingCondition Binding="{Binding ShowOnlyWebCamInLandscape}" Value="False"/>
                                        </MultiTrigger.Conditions>
                                        <Setter Property="Grid.Row" Value="1"/>
                                        <Setter Property="Grid.Column" Value="0"/>
                                        <Setter Property="Grid.ColumnSpan" Value="1"/>
                                    </MultiTrigger>
                                    <MultiTrigger TargetType="Grid">
                                        <MultiTrigger.Conditions>
                                            <BindingCondition Binding="{Binding IsPortrait}" Value="False"/>
                                            <BindingCondition Binding="{Binding ShowOnlyWebCamInLandscape}" Value="True"/>
                                        </MultiTrigger.Conditions>
                                        <Setter Property="Grid.Row" Value="0"/>
                                        <Setter Property="Grid.RowSpan" Value="3"/>
                                        <Setter Property="Grid.Column" Value="0"/>
                                        <Setter Property="Grid.ColumnSpan" Value="3"/>
                                    </MultiTrigger>
                                    <!-- Visibility -->
                                    <!-- Hide while printing if set in option -->
                                    <MultiTrigger TargetType="Grid">
                                        <MultiTrigger.Conditions>
                                            <BindingCondition Binding="{Binding IsPrinting}" Value="False"/>
                                            <BindingCondition Binding="{Binding CollapseTopViewWhileNotPrinting}" Value="True"/>
                                        </MultiTrigger.Conditions>
                                        <Setter Property="IsVisible" Value="False"/>
                                    </MultiTrigger>
                                </Style.Triggers>
                            </Style>
                        </Grid.Style>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="{OnIdiom Phone=92, Tablet=112, Default=92}"/>
                            <ColumnDefinition Width="*"/>
                            <ColumnDefinition Width="{OnIdiom Phone=92, Tablet=112, Default=92}"/>
                        </Grid.ColumnDefinitions>
                        <Grid.RowDefinitions>
                            <RowDefinition />
                            <RowDefinition Height="Auto"/>
                        </Grid.RowDefinitions>

                        <!-- Button right -->
                        <Grid 
                            Grid.Column="2"
                            Grid.RowSpan="2"
                            CompressedLayout.IsHeadless="true"
                            >
                            <Grid.RowDefinitions>
                                <RowDefinition Height="{OnIdiom Tablet=64, Default=48}"/>
                                <RowDefinition />
                                <RowDefinition Height="Auto"/>
                            </Grid.RowDefinitions>

                            <!-- Toggle image / webcam -->
                            <buttons:SfButton 
                                    VerticalOptions="Start"
                                    HorizontalOptions="End"
                                    Margin="5,5"
                                    Command="{Binding ToggleImageWebCamViewCommand}" 
                                    TextColor="{DynamicResource White}"
                                    >
                                <buttons:SfButton.Style>
                                    <Style TargetType="buttons:SfButton" BasedOn="{StaticResource RoundMaterialDesignIconButtonStyle}">
                                        <Setter Property="Text" Value="{StaticResource MaterialDesign_ImageOutline}"/>
                                        <Setter Property="CommandParameter" Value="Pause"/>

                                        <Style.Triggers>
                                            <MultiTrigger TargetType="buttons:SfButton">
                                                <MultiTrigger.Conditions>
                                                    <BindingCondition Binding="{Binding ShowImage}" Value="True"/>
                                                </MultiTrigger.Conditions>
                                                <Setter Property="Text" Value="{StaticResource MaterialDesign_CameraOutline}"/>
                                                <Setter Property="CommandParameter" Value="Play"/>
                                            </MultiTrigger>
                                        </Style.Triggers>
                                    </Style>
                                </buttons:SfButton.Style>
                            </buttons:SfButton>

                            <!-- Fullscreen view -->
                            <buttons:SfButton 
                                    Grid.Row="2"
                                    VerticalOptions="Start" 
                                    HorizontalOptions="End"   
                                    Command="{Binding OpenWebCamViewCommand}" 
                                    TextColor="{DynamicResource White}"
                                    Margin="{OnPlatform Android='4,0,4,40', Default='4,0,4,30'}"
                                    Text="{StaticResource MaterialDesign_Fullscreen}"
                                    >
                                <buttons:SfButton.Style>
                                    <Style TargetType="buttons:SfButton" BasedOn="{StaticResource MaterialDesignIconButtonStyle}">
                                        <Setter Property="IsVisible" Value="False"/>
                                        <Style.Triggers>
                                            <MultiTrigger TargetType="buttons:SfButton">
                                                <MultiTrigger.Conditions>
                                                    <BindingCondition Binding="{Binding WebCamEnabled}" Value="True"/>
                                                    <BindingCondition Binding="{Binding ShowImage}" Value="False"/>
                                                    <BindingCondition Binding="{Binding IsLoadingWebCamStream}" Value="False"/>
                                                </MultiTrigger.Conditions>
                                                <Setter Property="IsVisible" Value="True"/>
                                            </MultiTrigger>
                                        </Style.Triggers>
                                    </Style>
                                </buttons:SfButton.Style>
                            </buttons:SfButton>

                        </Grid>

                        <!-- Button left -->
                        <Grid
                            Grid.RowSpan="2"
                            CompressedLayout.IsHeadless="true"
                            >
                            <!-- Collapse title view -->
                            <buttons:SfButton 
                                    VerticalOptions="Start"
                                    Command="{Binding CollapseExpandTopViewCommand}" 
                                    TextColor="{DynamicResource White}"
                                    Margin="5,5"
                                    >
                                <buttons:SfButton.Style>
                                    <Style TargetType="buttons:SfButton" BasedOn="{StaticResource RoundMaterialDesignIconButtonStyle}">
                                        <Setter Property="Text" Value="{StaticResource MaterialDesign_ArrowExpand}"/>
                                        <Setter Property="IsVisible" Value="False"/>
                                        <Style.Triggers>
                                            <MultiTrigger TargetType="buttons:SfButton">
                                                <MultiTrigger.Conditions>
                                                    <BindingCondition Binding="{Binding ShowImage}" Value="True"/>
                                                    <BindingCondition Binding="{Binding IsPortrait}" Value="True"/>
                                                </MultiTrigger.Conditions>
                                                <Setter Property="IsVisible" Value="True"/>
                                            </MultiTrigger>
                                            <DataTrigger
                                                    TargetType="buttons:SfButton"
                                                    Binding="{Binding ExpandTopView}"
                                                    Value="True">
                                                <Setter Property="Text" Value="{StaticResource MaterialDesign_ArrowCollapse}"/>
                                            </DataTrigger>
                                        </Style.Triggers>
                                    </Style>
                                </buttons:SfButton.Style>
                            </buttons:SfButton>

                            <!-- Enable -->
                            <buttons:SfButton 
                                    VerticalOptions="Start"
                                    ShowIcon="False"
                                    Command="{Binding EnableWebCamCommand}"
                                    TextColor="{DynamicResource White}"
                                    FontSize="24" 
                                    Margin="5,5"
                                    BackgroundColor="{DynamicResource Transparent}"
                                    >
                                <buttons:SfButton.Content>
                                    <Grid>
                                        <Grid.ColumnDefinitions>
                                            <ColumnDefinition Width="Auto"/>
                                            <ColumnDefinition />
                                        </Grid.ColumnDefinitions>
                                        <Label 
                                                Text="{StaticResource MaterialDesign_Webcam}"
                                                Style="{StaticResource MaterialFontFamilyIconLabelStyle}"
                                                TextColor="{DynamicResource White}"
                                                VerticalTextAlignment="Center"
                                                />
                                        <Label
                                                Text="{x:Static localization:Strings.On}"
                                                TextColor="{DynamicResource White}"
                                                Style="{StaticResource LabelStyle}"
                                                Grid.Column="1"
                                                VerticalTextAlignment="Center"
                                                />
                                    </Grid>
                                </buttons:SfButton.Content>
                                <buttons:SfButton.Style>
                                    <Style TargetType="buttons:SfButton" BasedOn="{StaticResource SetupButtonStyle}">
                                        <Setter Property="IsVisible" Value="False"/>
                                        <Style.Triggers>
                                            <MultiTrigger TargetType="buttons:SfButton">
                                                <MultiTrigger.Conditions>
                                                    <BindingCondition Binding="{Binding WebCamEnabled}" Value="False"/>
                                                    <BindingCondition Binding="{Binding ShowImage}" Value="False"/>
                                                    <BindingCondition Binding="{Binding IsLoadingWebCamStream}" Value="False"/>
                                                </MultiTrigger.Conditions>
                                                <Setter Property="IsVisible" Value="True"/>
                                            </MultiTrigger>
                                        </Style.Triggers>
                                    </Style>
                                </buttons:SfButton.Style>
                            </buttons:SfButton>

                            <!-- Select webcam -->
                            <buttons:SfButton 
                                    VerticalOptions="Start"
                                    Command="{Binding SelectWebCamIndexCommand}" 
                                    TextColor="{DynamicResource White}"
                                    Margin="5,5"
                                    >
                                <buttons:SfButton.Style>
                                    <Style TargetType="buttons:SfButton" BasedOn="{StaticResource RoundMaterialDesignIconButtonStyle}">
                                        <Setter Property="Text" Value="{StaticResource MaterialDesign_CameraSwitchOutline}"/>
                                        <Setter Property="IsVisible" Value="False"/>
                                        <Style.Triggers>
                                            <MultiTrigger TargetType="buttons:SfButton">
                                                <MultiTrigger.Conditions>
                                                    <BindingCondition Binding="{Binding ShowImage}" Value="False"/>
                                                    <BindingCondition Binding="{Binding WebCamEnabled}" Value="True"/>
                                                </MultiTrigger.Conditions>
                                                <Setter Property="IsVisible" Value="True"/>
                                            </MultiTrigger>
                                        </Style.Triggers>
                                    </Style>
                                </buttons:SfButton.Style>
                            </buttons:SfButton>
                        </Grid>

                        <!-- Button bottom -->
                        <!-- Grid.ColumnSpan="3" -->
                        <Grid
                            Margin="0,0,0,35"
                            Grid.Row="1" 
                            Grid.Column="1"
                            IsVisible="{Binding ExpandTopView}"
                            >
                            <!-- Expander -->
                            <border:SfBorder
                                    IsVisible="{Binding IsPrinting}"
                                    HorizontalOptions="Center"
                                    >
                                <border:SfBorder.Style>
                                    <Style 
                                            TargetType="border:SfBorder">
                                        <Setter Property="BackgroundColor" Value="{DynamicResource Transparent}"/>
                                        <Setter Property="BorderWidth" Value="0"/>
                                        <Style.Triggers>
                                            <DataTrigger 
                                                    TargetType="border:SfBorder" 
                                                    Binding="{Binding ExpandPrintOptions}"
                                                    Value="True">
                                                <Setter Property="BackgroundColor" Value="{DynamicResource Gray-100}"/>
                                                <Setter Property="BorderWidth" Value="1"/>
                                            </DataTrigger>
                                        </Style.Triggers>
                                    </Style>
                                </border:SfBorder.Style>
                                <StackLayout 
                                        Orientation="Horizontal">
                                    <!-- Expand button -->
                                    <buttons:SfButton 
                                            Text="{StaticResource MaterialDesign_NozzleOutline}" 
                                            Command="{Binding TogglePrintActionMenuCommand}" 
                                            HorizontalOptions="Center" 
                                            VerticalOptions="Start"
                                            TextColor="{DynamicResource White}"
                                            Margin="4,0"

                                                >
                                        <buttons:SfButton.Style>
                                            <Style 
                                                    TargetType="buttons:SfButton"
                                                    BasedOn="{StaticResource RoundMaterialDesignIconButtonStyle}">
                                                <Setter Property="Text" Value="{StaticResource MaterialDesign_NozzleOutline}"/>
                                                <Style.Triggers>
                                                    <DataTrigger TargetType="buttons:SfButton" Binding="{Binding ExpandPrintOptions}" Value="True">
                                                        <Setter Property="Text" Value="{StaticResource MaterialDesign_ArrowCollapse}"/>
                                                        <Setter Property="TextColor" Value="{DynamicResource Gray-Black}"/>
                                                    </DataTrigger>
                                                </Style.Triggers>
                                            </Style>
                                        </buttons:SfButton.Style>
                                    </buttons:SfButton>
                                    <!-- Content -->
                                    <StackLayout
                                            IsVisible="{Binding ExpandPrintOptions}"
                                            Orientation="Horizontal">
                                        <!-- Pause button -->
                                        <buttons:SfButton 
                                                    VerticalOptions="Start" HorizontalOptions="Center"  
                                                    Command="{Binding TogglePauseCommand}" 
                                                    TextColor="{DynamicResource Gray-Black}"
                                                    Margin="4,0"
                                                    >
                                            <buttons:SfButton.Style>
                                                <Style TargetType="buttons:SfButton" BasedOn="{StaticResource RoundMaterialDesignIconButtonStyle}">
                                                    <Setter Property="Text" Value="{StaticResource MaterialDesign_Pause}"/>
                                                    <Setter Property="CommandParameter" Value="Pause"/>

                                                    <Style.Triggers>
                                                        <MultiTrigger TargetType="buttons:SfButton">
                                                            <MultiTrigger.Conditions>
                                                                <BindingCondition Binding="{Binding IsPaused}" Value="True"/>
                                                            </MultiTrigger.Conditions>
                                                            <Setter Property="Text" Value="{StaticResource MaterialDesign_Play}"/>
                                                            <Setter Property="CommandParameter" Value="Play"/>
                                                        </MultiTrigger>
                                                    </Style.Triggers>
                                                </Style>
                                            </buttons:SfButton.Style>
                                        </buttons:SfButton>

                                        <!-- Stop button -->
                                        <buttons:SfButton 
                                                Text="{StaticResource MaterialDesign_Stop}" 
                                                Command="{Binding CancelJobCommand}" 
                                                Style="{StaticResource RoundMaterialDesignIconButtonStyle}"
                                                HorizontalOptions="Center" 
                                                VerticalOptions="Start"
                                                TextColor="{DynamicResource Gray-Black}"
                                                Margin="4,0"

                                                />
                                    </StackLayout>
                                </StackLayout>
                            </border:SfBorder>
                        </Grid>
                    </Grid>

                </Grid>
            </PullToRefresh:SfPullToRefresh.PullableContent>
        </PullToRefresh:SfPullToRefresh>

        <!-- Tablet Mode -->
        <Grid
            RowSpacing="0"
            IsVisible="{Binding IsTabletMode}"
            >
            <Grid.RowDefinitions>

                <RowDefinition Height="2" />
                <RowDefinition Height="Auto" />
                <RowDefinition />
            </Grid.RowDefinitions>

            <border:SfBorder 
                Grid.Row="0"
                Margin="0"
                Style="{StaticResource MenuSeparatorBorderStyle}"
                BackgroundColor="{DynamicResource Gray-200}"
                />

            <!-- Header bar -->
            <!-- Only makes sense on tablet -->
            <Grid
                Grid.Row="1"
                ColumnSpacing="16"
                Padding="20,5"
                BackgroundColor="{DynamicResource Gray-100}"
                IsVisible="{OnIdiom Tablet=True, Default=False}"
                >
                <Grid.ColumnDefinitions>
                    <ColumnDefinition />
                    <!-- Main Extruder -->
                    <ColumnDefinition />
                    <!-- Secondary Extruder -->
                    <ColumnDefinition />
                    <!-- Heated Bed -->
                    <ColumnDefinition />
                    <!-- Heated Chamber -->
                    <ColumnDefinition />
                    <!-- Fan -->
                    <ColumnDefinition />
                    <!-- Speed -->
                    <ColumnDefinition />
                    <!-- Flow -->
                </Grid.ColumnDefinitions>

                <!-- Main Extruder -->
                <controls:TapAnimationGrid
                    Command="{Binding InputExtruderTempCommand}"
                    CommandParameter="0"
                    >
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="4"/>
                        <ColumnDefinition Width="Auto"/>
                        <ColumnDefinition />
                    </Grid.ColumnDefinitions>

                    <Grid.RowDefinitions>
                        <RowDefinition />
                        <RowDefinition />
                    </Grid.RowDefinitions>

                    <border:SfBorder 
                        Grid.RowSpan="2"
                        Style="{StaticResource MenuSeparatorBorderStyle}"
                        />

                    <Label
                        Grid.Column="1"
                        Grid.RowSpan="2"
                        Style="{StaticResource PrimaryMaterialFontFamilyIconLabelStyle}"
                        Text="{StaticResource MaterialDesign_NozzleOutline}"
                        VerticalTextAlignment="Center"
                        HorizontalTextAlignment="Center"
                        />

                    <Label
                        Grid.Column="2"
                        Style="{StaticResource LabelStyle}"                   
                        TextColor="{DynamicResource Gray-800}"
                        HorizontalTextAlignment="Start"
                        VerticalTextAlignment="End"
                        >
                        <Label.FormattedText>
                            <FormattedString>
                                <FormattedString.Spans>
                                    <Span Text="{Binding MainExtruder.TempRead}" />
                                    <Span Text=" C°" />
                                </FormattedString.Spans>
                            </FormattedString>
                        </Label.FormattedText>
                    </Label>

                    <Label
                                Grid.Column="2"
                                Grid.Row="1"
                                Style="{StaticResource SmallLabelStyle}"
                                VerticalTextAlignment="Start">
                        <Label.FormattedText>
                            <FormattedString>
                                <FormattedString.Spans>
                                    <Span Text="{Binding MainExtruder.TempSet}" />
                                    <Span Text=" C°" />
                                </FormattedString.Spans>
                            </FormattedString>
                        </Label.FormattedText>
                    </Label>
                </controls:TapAnimationGrid>

                <!-- Secondary Extruder -->
                <controls:TapAnimationGrid
                    Grid.Column="1"
                    IsEnabled="{Binding HasDoubleExtruder}"
                    Command="{Binding InputExtruderTempCommand}"
                    CommandParameter="1"
                    >
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="4"/>
                        <ColumnDefinition Width="Auto"/>
                        <ColumnDefinition />
                    </Grid.ColumnDefinitions>

                    <Grid.RowDefinitions>
                        <RowDefinition />
                        <RowDefinition />
                    </Grid.RowDefinitions>

                    <border:SfBorder 
                        Grid.RowSpan="2"
                        Style="{StaticResource MenuSeparatorBorderStyle}"
                        />

                    <Label
                        Grid.Column="1"
                        Grid.RowSpan="2"
                        Style="{StaticResource PrimaryMaterialFontFamilyIconLabelStyle}"
                        Text="{StaticResource MaterialDesign_NozzleOutline}"
                        VerticalTextAlignment="Center"
                        HorizontalTextAlignment="Center"
                        />

                    <!-- n.a. -->
                    <Label
                        Grid.Column="2"
                        Grid.RowSpan="2"
                        Style="{StaticResource LabelStyle}"                   
                        TextColor="{DynamicResource Error}"
                        HorizontalTextAlignment="Start"
                        VerticalTextAlignment="End"
                        Text="{x:Static localization:Strings.NotAvailableDots}"
                        IsVisible="{Binding HasDoubleExtruder, Converter={StaticResource BooleanReverseVisibilityConverter}}"
                        />

                    <Label
                        Grid.Column="2"
                        Style="{StaticResource LabelStyle}"                   
                        TextColor="{DynamicResource Gray-800}"
                        HorizontalTextAlignment="Start"
                        VerticalTextAlignment="End"
                        IsVisible="{Binding HasDoubleExtruder}"
                        >
                        <Label.FormattedText>
                            <FormattedString>
                                <FormattedString.Spans>
                                    <Span Text="{Binding SecondaryExtruder.TempRead}" />
                                    <Span Text=" C°" />
                                </FormattedString.Spans>
                            </FormattedString>
                        </Label.FormattedText>
                    </Label>

                    <Label
                        Grid.Column="2"
                        Grid.Row="1"
                        Style="{StaticResource SmallLabelStyle}"
                        VerticalTextAlignment="Start"
                        IsVisible="{Binding HasDoubleExtruder}"
                        >
                        <Label.FormattedText>
                            <FormattedString>
                                <FormattedString.Spans>
                                    <Span Text="{Binding SecondaryExtruder.TempSet}" />
                                    <Span Text=" C°" />
                                </FormattedString.Spans>
                            </FormattedString>
                        </Label.FormattedText>
                    </Label>
                </controls:TapAnimationGrid>

                <!-- Heated Bed -->
                <controls:TapAnimationGrid
                    Grid.Column="2"
                    IsEnabled="{Binding HasHeatedBed}"
                    Command="{Binding InputHeatedBedTempCommand}"
                    >
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="4"/>
                        <ColumnDefinition Width="Auto"/>
                        <ColumnDefinition />
                    </Grid.ColumnDefinitions>

                    <Grid.RowDefinitions>
                        <RowDefinition />
                        <RowDefinition />
                    </Grid.RowDefinitions>

                    <border:SfBorder 
                        Grid.RowSpan="2"
                        Style="{StaticResource MenuSeparatorBorderStyle}"
                        />

                    <Label
                        Grid.Column="1"
                        Grid.RowSpan="2"
                        Style="{StaticResource PrimaryMaterialFontFamilyIconLabelStyle}"
                        Text="{StaticResource MaterialDesign_Heatbed}"
                        VerticalTextAlignment="Center"
                        HorizontalTextAlignment="Center"
                        />

                    <!-- n.a. -->
                    <Label
                        Grid.Column="2"
                        Grid.RowSpan="2"
                        Style="{StaticResource LabelStyle}"                   
                        TextColor="{DynamicResource Error}"
                        HorizontalTextAlignment="Start"
                        VerticalTextAlignment="End"
                        Text="{x:Static localization:Strings.NotAvailableDots}"
                        IsVisible="{Binding HasHeatedBed, Converter={StaticResource BooleanReverseVisibilityConverter}}"
                        />

                    <Label
                        Grid.Column="2"
                        Style="{StaticResource LabelStyle}"                   
                        TextColor="{DynamicResource Gray-800}"
                        HorizontalTextAlignment="Start"
                        VerticalTextAlignment="End"
                        IsVisible="{Binding HasHeatedBed}"
                        >
                        <Label.FormattedText>
                            <FormattedString>
                                <FormattedString.Spans>
                                    <Span Text="{Binding SelectedHeatedBed.TempRead}" />
                                    <Span Text=" C°" />
                                </FormattedString.Spans>
                            </FormattedString>
                        </Label.FormattedText>
                    </Label>

                    <Label
                        Grid.Column="2"
                        Grid.Row="1"
                        Style="{StaticResource SmallLabelStyle}"
                        VerticalTextAlignment="Start"
                        IsVisible="{Binding HasHeatedBed}"
                        >
                        <Label.FormattedText>
                            <FormattedString>
                                <FormattedString.Spans>
                                    <Span Text="{Binding SelectedHeatedBed.TempSet}" />
                                    <Span Text=" C°" />
                                </FormattedString.Spans>
                            </FormattedString>
                        </Label.FormattedText>
                    </Label>
                </controls:TapAnimationGrid>

                <!-- Heated Chamber -->
                <controls:TapAnimationGrid
                    Grid.Column="3"
                    IsEnabled="{Binding HasHeatedChamber}"
                    Command="{Binding InputHeatedChamberTempCommand}"
                    >
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="4"/>
                        <ColumnDefinition Width="Auto"/>
                        <ColumnDefinition />
                    </Grid.ColumnDefinitions>

                    <Grid.RowDefinitions>
                        <RowDefinition />
                        <RowDefinition />
                    </Grid.RowDefinitions>

                    <border:SfBorder 
                        Grid.RowSpan="2"
                        Style="{StaticResource MenuSeparatorBorderStyle}"
                        />

                    <Label
                        Grid.Column="1"
                        Grid.RowSpan="2"
                        Style="{StaticResource PrimaryMaterialFontFamilyIconLabelStyle}"
                        Text="{StaticResource MaterialDesign_HeatedChamber}"
                        VerticalTextAlignment="Center"
                        HorizontalTextAlignment="Center"
                        />

                    <!-- n.a. -->
                    <Label
                        Grid.Column="2"
                        Grid.RowSpan="2"
                        Style="{StaticResource LabelStyle}"                   
                        TextColor="{DynamicResource Error}"
                        HorizontalTextAlignment="Start"
                        VerticalTextAlignment="End"
                        Text="{x:Static localization:Strings.NotAvailableDots}"
                        IsVisible="{Binding HasHeatedChamber, Converter={StaticResource BooleanReverseVisibilityConverter}}"
                        />

                    <Label
                        Grid.Column="2"
                        Style="{StaticResource LabelStyle}"                   
                        TextColor="{DynamicResource Gray-800}"
                        HorizontalTextAlignment="Start"
                        VerticalTextAlignment="End"
                        IsVisible="{Binding HasHeatedChamber}"
                        >
                        <Label.FormattedText>
                            <FormattedString>
                                <FormattedString.Spans>
                                    <Span Text="{Binding SelectedHeatedChamber.TempRead}" />
                                    <Span Text=" C°" />
                                </FormattedString.Spans>
                            </FormattedString>
                        </Label.FormattedText>
                    </Label>

                    <Label
                        Grid.Column="2"
                        Grid.Row="1"
                        Style="{StaticResource SmallLabelStyle}"
                        VerticalTextAlignment="Start"
                        IsVisible="{Binding HasHeatedChamber}"
                        >
                        <Label.FormattedText>
                            <FormattedString>
                                <FormattedString.Spans>
                                    <Span Text="{Binding SelectedHeatedChamber.TempSet}" />
                                    <Span Text=" C°" />
                                </FormattedString.Spans>
                            </FormattedString>
                        </Label.FormattedText>
                    </Label>
                </controls:TapAnimationGrid>

                <!-- Fan -->
                <controls:TapAnimationGrid
                    Grid.Column="4"
                    IsVisible="{Binding HasFan}"
                    Command="{Binding InputFanSpeedCommand}"
                    >
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="4"/>
                        <ColumnDefinition Width="Auto"/>
                        <ColumnDefinition />
                    </Grid.ColumnDefinitions>

                    <border:SfBorder 
                        Style="{StaticResource MenuSeparatorBorderStyle}"
                        />

                    <Label
                        Grid.Column="1"
                        Style="{StaticResource PrimaryMaterialFontFamilyIconLabelStyle}"
                        Text="{StaticResource MaterialDesign_Fan}"
                        VerticalTextAlignment="Center"
                        HorizontalTextAlignment="Center"
                        />

                    <!-- n.a. -->
                    <Label
                        Grid.Column="2"
                        Style="{StaticResource LabelStyle}"                   
                        TextColor="{DynamicResource Error}"
                        HorizontalTextAlignment="Start"
                        VerticalTextAlignment="End"
                        Text="{x:Static localization:Strings.NotAvailableDots}"
                        IsVisible="{Binding HasFan, Converter={StaticResource BooleanReverseVisibilityConverter}}"
                        />

                    <Label
                        Grid.Column="2"
                        Style="{StaticResource LabelStyle}"                   
                        TextColor="{DynamicResource Gray-800}"
                        HorizontalTextAlignment="Start"
                        VerticalTextAlignment="Center"
                        IsVisible="{Binding HasFan}"
                        >
                        <Label.FormattedText>
                            <FormattedString>
                                <FormattedString.Spans>
                                    <Span Text="{Binding SelectedFan.Speed}" />
                                    <Span Text=" %" />
                                </FormattedString.Spans>
                            </FormattedString>
                        </Label.FormattedText>
                    </Label>
                </controls:TapAnimationGrid>

                <!-- Speed -->
                <controls:TapAnimationGrid
                    Grid.Column="5"
                    Command="{Binding InputSpeedCommand}"
                    >
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="4"/>
                        <ColumnDefinition Width="Auto"/>
                        <ColumnDefinition />
                    </Grid.ColumnDefinitions>

                    <border:SfBorder 
                        Style="{StaticResource MenuSeparatorBorderStyle}"
                        />

                    <Label
                        Grid.Column="1"
                        Style="{StaticResource PrimaryMaterialFontFamilyIconLabelStyle}"
                        Text="{StaticResource MaterialDesign_Speedometer}"
                        VerticalTextAlignment="Center"
                        HorizontalTextAlignment="Center"
                        />

                    <Label
                        Grid.Column="2"
                        Style="{StaticResource LabelStyle}"                   
                        TextColor="{DynamicResource Gray-800}"
                        HorizontalTextAlignment="Start"
                        VerticalTextAlignment="Center"
                        >
                        <Label.FormattedText>
                            <FormattedString>
                                <FormattedString.Spans>
                                    <Span Text="{Binding SpeedMultiplier}" />
                                    <Span Text=" %" />
                                </FormattedString.Spans>
                            </FormattedString>
                        </Label.FormattedText>
                    </Label>
                </controls:TapAnimationGrid>

                <!-- Flow -->
                <controls:TapAnimationGrid
                    Grid.Column="6"
                    Command="{Binding InputFlowCommand}"
                    >
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="4"/>
                        <ColumnDefinition Width="Auto"/>
                        <ColumnDefinition />
                    </Grid.ColumnDefinitions>

                    <border:SfBorder 
                        Style="{StaticResource MenuSeparatorBorderStyle}"
                        />

                    <Label
                        Grid.Column="1"
                        Style="{StaticResource PrimaryMaterialFontFamilyIconLabelStyle}"
                        Text="{StaticResource MaterialDesign_Valve}"
                        VerticalTextAlignment="Center"
                        HorizontalTextAlignment="Center"
                        />

                    <Label
                        Grid.Column="2"
                        Style="{StaticResource LabelStyle}"                   
                        TextColor="{DynamicResource Gray-800}"
                        HorizontalTextAlignment="Start"
                        VerticalTextAlignment="Center"
                        >
                        <Label.FormattedText>
                            <FormattedString>
                                <FormattedString.Spans>
                                    <Span Text="{Binding FlowMultiplier}" />
                                    <Span Text=" %" />
                                </FormattedString.Spans>
                            </FormattedString>
                        </Label.FormattedText>
                    </Label>
                </controls:TapAnimationGrid>
            </Grid>

            <!-- Tabs -->
            <tabView:SfTabView
                Grid.Row="2"
                IsVisible="{Binding IsTabletMode}"
                DisplayMode="ImageWithText"
                TabHeaderPosition="Top"
                SelectedIndex="{Binding TabletTabIndex}"
                >
                <tabView:SfTabView.Style>
                    <Style TargetType="tabView:SfTabView" BasedOn="{StaticResource TabViewDefaultStyle}">
                        <Setter Property="VisibleHeaderCount" Value="4"/>
                        <!---->
                        <Style.Triggers>
                            <DataTrigger
                                TargetType="tabView:SfTabView"
                                Binding="{Binding IsPrinterOnline}"
                                Value="False">
                                <Setter Property="VisibleHeaderCount" Value="5"/>
                            </DataTrigger>
                        </Style.Triggers>

                    </Style>
                </tabView:SfTabView.Style>
                <!-- Files -->
                <tabView:SfTabItem 
                    Title="{x:Static localization:Strings.Files}"
                    IconFont="{StaticResource MaterialDesign_FileOutline}"
                    Style="{StaticResource SmallTabViewItemDefaultStyle}"
                    >
                    <tabView:SfTabItem.Content>
                        <Grid>

                        </Grid>
                    </tabView:SfTabItem.Content>
                </tabView:SfTabItem>

                <!-- Control -->
                <tabView:SfTabItem 
                    Title="{x:Static localization:Strings.ControlPanel}"
                    IconFont="{StaticResource MaterialDesign_TuneVertical}"
                    Style="{StaticResource SmallTabViewItemDefaultStyle}"
                    IsVisible="{Binding IsPrinterOnline}"
                    >
                    <tabView:SfTabItem.Content>
                        <StackLayout
                            CompressedLayout.IsHeadless="True">
                            <ScrollView>
                                <StackLayout
                                    Margin="16,10"
                                    Spacing="12"
                                    >

                                </StackLayout>
                            </ScrollView>
                        </StackLayout>
                    </tabView:SfTabItem.Content>
                </tabView:SfTabItem>

                <!-- Movement -->
                <tabView:SfTabItem 
                    Title="{x:Static localization:Strings.Control}"
                    IconFont="{StaticResource MaterialDesign_AxisArrow}"
                    Style="{StaticResource SmallTabViewItemDefaultStyle}"
                    IsVisible="{Binding IsPrinterOnline}"
                    >
                    <tabView:SfTabItem.Content>
                        <Grid>
                            <Grid.RowDefinitions>
                                <RowDefinition />
                                <RowDefinition Height="Auto"/>
                            </Grid.RowDefinitions>
                            <ScrollView>
                                <Grid
                                    Margin="16,10"
                                    RowSpacing="12"
                                    >

                                </Grid>
                            </ScrollView>

                            <StackLayout 
                                Grid.Row="1"
                                Margin="20,10"
                                >
                                <Label
                                    Text="{x:Static localization:Strings.DistanceInMilimeter}"
                                    Style="{StaticResource SmallLabelStyle}"
                                    VerticalTextAlignment="Center"
                                    HorizontalTextAlignment="Center"
                                    />
                                <buttons:SfSegmentedControl
                                    HeightRequest="48"
                                    DisplayMode="Text"
                                    FontIconFontColor="{DynamicResource Gray-900}"
                                    Style="{StaticResource PrinterSegmentControlStyle}" 
                                    ItemsSource="{Binding Steps}"
                                    SelectedIndex="{Binding SelectedStepSize}"  
                                    SegmentBorderColor="{DynamicResource Gray-100}"
                                    SegmentBackgroundColor="{DynamicResource Gray-100}"
                                    />
                            </StackLayout>
                        </Grid>
                    </tabView:SfTabItem.Content>
                </tabView:SfTabItem>

                <!-- WebCam -->
                <tabView:SfTabItem 
                    Title="{x:Static localization:Strings.WebCam}"
                    IconFont="{StaticResource MaterialDesign_Webcam}"
                    Style="{StaticResource SmallTabViewItemDefaultStyle}"
                    >
                    <tabView:SfTabItem.Content>
                        <!-- Needs to be in a Grid, otherwise the WebCam view does not work on Android -->
                        <Grid>
                            <PullToRefresh:SfPullToRefresh
                                IsRefreshing="{Binding IsRestartingWebCamStream}" 
                                RefreshCommand="{Binding RestartWebCamViewCommand}"
                                Style="{StaticResource DefaultPullToRefreshStyle}"
                                >
                                <PullToRefresh:SfPullToRefresh.PullableContent>
                                    <!-- BackgroundColor="{DynamicResource PrimaryColor}" -->
                                    <Grid>
                                        <!-- Image / webcam -->
                                        <!-- CompressedLayout.IsHeadless="true" -->
                                        <Grid
                                            CompressedLayout.IsHeadless="true"
                                            >
                                            <!-- CompressedLayout.IsHeadless="true" -->
                                            <Grid
                                                CompressedLayout.IsHeadless="true"
                                                >
                                                <!-- CompressedLayout.IsHeadless="true" -->
                                                <Grid
                                                    RowSpacing="0"
                                                    >
                                                    <!-- MediaPlayer="{Binding MediaPlayer}" -->
                                                    <vlc:MediaPlayerElement 
                                                        x:Name="videoViewTablet"
                                                        BackgroundColor="{DynamicResource Black}"
                                                        EnableRendererDiscovery="True"
                                                        >
                                                        <vlc:MediaPlayerElement.Style>
                                                            <Style TargetType="vlc:MediaPlayerElement">
                                                                <Setter Property="IsVisible" Value="False"/>
                                                                <Style.Triggers>
                                                                    <DataTrigger
                                                                            TargetType="vlc:MediaPlayerElement"
                                                                            Binding="{Binding IsTabletMode}"
                                                                            Value="True">
                                                                        <Setter
                                                                            Property="MediaPlayer"
                                                                            Value="{Binding MediaPlayer}"
                                                                            />
                                                                    </DataTrigger>

                                                                    <MultiTrigger TargetType="vlc:MediaPlayerElement">
                                                                        <MultiTrigger.Conditions>
                                                                            <BindingCondition Binding="{Binding WebCamEnabled}" Value="True"/>
                                                                            <BindingCondition Binding="{Binding ShowImage}" Value="False"/>
                                                                        </MultiTrigger.Conditions>
                                                                        <Setter Property="IsVisible" Value="True"/>
                                                                    </MultiTrigger>
                                                                </Style.Triggers>
                                                            </Style>
                                                        </vlc:MediaPlayerElement.Style>
                                                        <vlc:MediaPlayerElement.PlaybackControls>
                                                            <vlc:PlaybackControls
                                                                IsVisible="False"
                                                                ShowAndHideAutomatically="False"
                                                                />
                                                        </vlc:MediaPlayerElement.PlaybackControls>
                                                    </vlc:MediaPlayerElement>

                                                    <busyindicator:SfBusyIndicator>
                                                        <busyindicator:SfBusyIndicator.Style>
                                                            <Style TargetType="busyindicator:SfBusyIndicator" BasedOn="{StaticResource LoadingBusyIndicatorStyle}">
                                                                <Setter Property="IsBusy" Value="False"/>
                                                                <Style.Triggers>
                                                                    <MultiTrigger TargetType="busyindicator:SfBusyIndicator">
                                                                        <MultiTrigger.Conditions>
                                                                            <BindingCondition Binding="{Binding IsLoadingWebCamStream}" Value="True"/>
                                                                            <BindingCondition Binding="{Binding IsRefreshing}" Value="False"/>
                                                                        </MultiTrigger.Conditions>
                                                                        <Setter Property="IsBusy" Value="True"/>
                                                                    </MultiTrigger>
                                                                </Style.Triggers>
                                                            </Style>
                                                        </busyindicator:SfBusyIndicator.Style>
                                                    </busyindicator:SfBusyIndicator>
                                                </Grid>

                                                <!-- WebCam offline / not available -->
                                                <StackLayout
                                                VerticalOptions="Center"
                                                >
                                                    <StackLayout.Style>
                                                        <Style TargetType="StackLayout">
                                                            <Setter Property="IsVisible" Value="False"/>
                                                            <Style.Triggers>
                                                                <MultiTrigger TargetType="StackLayout">
                                                                    <MultiTrigger.Conditions>
                                                                        <BindingCondition Binding="{Binding WebCamEnabled}" Value="False"/>
                                                                        <BindingCondition Binding="{Binding ShowImage}" Value="False"/>
                                                                        <BindingCondition Binding="{Binding IsLoadingWebCamStream}" Value="False"/>
                                                                    </MultiTrigger.Conditions>
                                                                    <Setter Property="IsVisible" Value="True"/>
                                                                </MultiTrigger>
                                                            </Style.Triggers>
                                                        </Style>
                                                    </StackLayout.Style>
                                                    <Label 
                                            Margin="4,10,0,10"
                                            VerticalTextAlignment="Center"
                                            HorizontalTextAlignment="Center"
                                            TextColor="{DynamicResource PrimaryColor}"
                                            FontSize="{OnIdiom Tablet=24, Default=20}"
                                            Text="{StaticResource MaterialDesign_CameraOff}"
                                            Style="{StaticResource MaterialFontFamilyIconLabelStyle}"
                                            />

                                                    <!-- Note -->
                                                    <Label 
                                                Style="{StaticResource SmallLabelStyle}" 
                                                TextColor="{DynamicResource White}"
                                                Text="{x:Static localization:Strings.NoteWebCamIsDisabledInSettings}" Margin="10" 
                                                LineBreakMode="WordWrap" 
                                                HorizontalTextAlignment="Center" 
                                                VerticalTextAlignment="Center"
                                                />
                                                </StackLayout>
                                            </Grid>

                                            <!-- Show Image or Webcam -->
                                            <!-- IsVisible="{Binding ShowImage}" -->
                                            <Grid 
                                            IsVisible="{Binding ShowImage}"
                                            BackgroundColor="{DynamicResource Gray-White}"
                                            >
                                                <Image 
                                                VerticalOptions="Start"
                                                Margin="{OnIdiom Phone='-4,0', Tablet='-62,0', Default='-4,0'}"
                                                Source="{Binding Thumbnail, Converter={StaticResource ByteArrayToImageConverter}}" 
                                                >
                                                    <Image.Style>
                                                        <Style TargetType="Image">
                                                            <Setter Property="Aspect" Value="AspectFit"/>
                                                            <Style.Triggers>
                                                                <DataTrigger
                                                        TargetType="Image"
                                                        Binding="{Binding IsPortrait}"
                                                        Value="False">
                                                                    <Setter Property="Aspect" Value="AspectFill"/>
                                                                </DataTrigger>
                                                            </Style.Triggers>
                                                        </Style>
                                                    </Image.Style>
                                                </Image>

                                                <!-- Note that image is only available during print -->
                                                <Label 
                                        Text="{x:Static localization:Strings.ImageOnlyAvailableDuringPrintDots}"
                                        VerticalTextAlignment="Center"
                                        HorizontalTextAlignment="Center"
                                        TextColor="{DynamicResource White}"
                                        >
                                                    <Label.Style>
                                                        <Style TargetType="Label" BasedOn="{StaticResource LabelStyle}">
                                                            <Setter Property="IsVisible" Value="False"/>
                                                            <Style.Triggers>
                                                                <MultiTrigger
                                                        TargetType="Label">
                                                                    <MultiTrigger.Conditions>
                                                                        <BindingCondition
                                                                Binding="{Binding IsPrinting}" 
                                                                Value="False"/>
                                                                    </MultiTrigger.Conditions>
                                                                    <Setter Property="IsVisible" Value="True"/>
                                                                </MultiTrigger>
                                                                <!--
                                                    <DataTrigger 
                                                        Binding="{Binding IsPrinting}" TargetType="Label"
                                                                    Value="False">
                                                        <Setter Property="IsVisible" Value="True"/>
                                                    </DataTrigger>
                                                    -->
                                                            </Style.Triggers>
                                                        </Style>
                                                    </Label.Style>

                                                </Label>

                                                <!-- if image is loading 
                                    <Grid IsVisible="{Binding IsLoadingImage}">-->
                                                <busyindicator:SfBusyIndicator
                                        IsBusy="{Binding IsLoadingImage}" 
                                        Style="{StaticResource LoadingBusyIndicatorStyle}" />
                                                <!--</Grid>-->
                                            </Grid>
                                        </Grid>

                                        <!-- Button Overlay -->
                                        <Grid>
                                            <Grid.ColumnDefinitions>
                                                <ColumnDefinition Width="{OnIdiom Phone=92, Tablet=112, Default=92}"/>
                                                <ColumnDefinition />
                                                <ColumnDefinition Width="{OnIdiom Phone=92, Tablet=112, Default=92}"/>
                                            </Grid.ColumnDefinitions>
                                            <Grid.RowDefinitions>
                                                <RowDefinition />
                                                <RowDefinition Height="Auto"/>
                                            </Grid.RowDefinitions>

                                            <!-- Button right -->
                                            <Grid 
                                                Grid.Column="2"
                                                Grid.RowSpan="2"
                                                CompressedLayout.IsHeadless="true"
                                                >
                                                <Grid.RowDefinitions>
                                                    <RowDefinition Height="{OnIdiom Tablet=64, Default=48}"/>
                                                    <RowDefinition />
                                                    <RowDefinition Height="Auto"/>
                                                </Grid.RowDefinitions>

                                                <!-- Toggle image / webcam -->
                                                <buttons:SfButton 
                                                    VerticalOptions="Start"
                                                    HorizontalOptions="End"
                                                    Margin="5,5"
                                                    Command="{Binding ToggleImageWebCamViewCommand}" 
                                                    >
                                                    <buttons:SfButton.Style>
                                                        <Style TargetType="buttons:SfButton" BasedOn="{StaticResource RoundMaterialDesignIconButtonStyle}">
                                                            <Setter Property="Text" Value="{StaticResource MaterialDesign_ImageOutline}"/>
                                                            <Setter Property="CommandParameter" Value="Pause"/>
                                                            <Setter Property="TextColor" Value="{DynamicResource White}"/>

                                                            <Style.Triggers>
                                                                <MultiTrigger TargetType="buttons:SfButton">
                                                                    <MultiTrigger.Conditions>
                                                                        <BindingCondition Binding="{Binding ShowImage}" Value="True"/>
                                                                    </MultiTrigger.Conditions>
                                                                    <Setter Property="Text" Value="{StaticResource MaterialDesign_CameraOutline}"/>
                                                                    <Setter Property="CommandParameter" Value="Play"/>
                                                                </MultiTrigger>

                                                                <!-- Change button color if image is empty -->
                                                                <MultiTrigger TargetType="buttons:SfButton">
                                                                    <MultiTrigger.Conditions>
                                                                        <BindingCondition Binding="{Binding ShowImage}" Value="True"/>
                                                                        <BindingCondition Binding="{Binding Thumbnail}" Value="{x:Null}"/>
                                                                    </MultiTrigger.Conditions>
                                                                    <Setter Property="TextColor" Value="{DynamicResource PrimaryColor}"/>
                                                                </MultiTrigger>
                                                                <!-- Change button color if webcam is not enabled, but selected -->
                                                                <MultiTrigger TargetType="buttons:SfButton">
                                                                    <MultiTrigger.Conditions>
                                                                        <BindingCondition Binding="{Binding ShowImage}" Value="False"/>
                                                                        <BindingCondition Binding="{Binding WebCamEnabled}" Value="False"/>
                                                                    </MultiTrigger.Conditions>
                                                                    <Setter Property="TextColor" Value="{DynamicResource PrimaryColor}"/>
                                                                </MultiTrigger>
                                                            </Style.Triggers>
                                                        </Style>
                                                    </buttons:SfButton.Style>
                                                </buttons:SfButton>

                                                <!-- Fullscreen view -->
                                                <buttons:SfButton 
                                                    Grid.Row="2"
                                                    VerticalOptions="Start" 
                                                    HorizontalOptions="End"   
                                                    Command="{Binding OpenWebCamViewCommand}" 
                                                    Margin="{OnPlatform Android='4,0,4,40', Default='4,0,4,30'}"
                                                    Text="{StaticResource MaterialDesign_Fullscreen}"
                                                    >
                                                    <buttons:SfButton.Style>
                                                        <Style TargetType="buttons:SfButton" BasedOn="{StaticResource MaterialDesignIconButtonStyle}">
                                                            <Setter Property="IsVisible" Value="False"/>
                                                            <Setter Property="TextColor" Value="{DynamicResource White}"/>
                                                            <Style.Triggers>
                                                                <MultiTrigger TargetType="buttons:SfButton">
                                                                    <MultiTrigger.Conditions>
                                                                        <BindingCondition Binding="{Binding WebCamEnabled}" Value="True"/>
                                                                        <BindingCondition Binding="{Binding ShowImage}" Value="False"/>
                                                                        <BindingCondition Binding="{Binding IsLoadingWebCamStream}" Value="False"/>
                                                                    </MultiTrigger.Conditions>
                                                                    <Setter Property="IsVisible" Value="True"/>
                                                                </MultiTrigger>

                                                                <!-- Change button color if image is empty 
                                                    <MultiTrigger TargetType="buttons:SfButton">
                                                        <MultiTrigger.Conditions>
                                                            <BindingCondition Binding="{Binding ShowImage}" Value="True"/>
                                                            <BindingCondition Binding="{Binding Thumbnail}" Value="{x:Null}"/>
                                                        </MultiTrigger.Conditions>
                                                        <Setter Property="TextColor" Value="{DynamicResource PrimaryColor}"/>
                                                    </MultiTrigger>-->
                                                            </Style.Triggers>
                                                        </Style>
                                                    </buttons:SfButton.Style>
                                                </buttons:SfButton>
                                            </Grid>

                                            <!-- Button left -->
                                            <Grid
                                                CompressedLayout.IsHeadless="true"
                                                Grid.RowSpan="2">
                                                <!-- Enable -->
                                                <buttons:SfButton 
                                                    VerticalOptions="Start"
                                                    ShowIcon="False"
                                                    Command="{Binding EnableWebCamCommand}"
                                                    FontSize="24" 
                                                    Margin="5,5"
                                                    BackgroundColor="{DynamicResource Transparent}"
                                                    >
                                                    <buttons:SfButton.Content>
                                                        <Grid>
                                                            <Grid.ColumnDefinitions>
                                                                <ColumnDefinition Width="Auto"/>
                                                                <ColumnDefinition />
                                                            </Grid.ColumnDefinitions>
                                                            <Label 
                                                                Text="{StaticResource MaterialDesign_Webcam}"
                                                                VerticalTextAlignment="Center"
                                                                >
                                                                <Label.Style>
                                                                    <Style TargetType="Label" BasedOn="{StaticResource MaterialFontFamilyIconLabelStyle}">
                                                                        <Setter Property="TextColor" Value="{DynamicResource White}"/>
                                                                        <Style.Triggers>
                                                                                     <!-- Change button color if webcam is not enabled, but selected -->
                                                                            <MultiTrigger TargetType="Label">
                                                                                <MultiTrigger.Conditions>
                                                                                    <BindingCondition Binding="{Binding ShowImage}" Value="False"/>
                                                                                    <BindingCondition Binding="{Binding WebCamEnabled}" Value="False"/>
                                                                                </MultiTrigger.Conditions>
                                                                                <Setter Property="TextColor" Value="{DynamicResource PrimaryColor}"/>
                                                                            </MultiTrigger>
                                                                        </Style.Triggers>
                                                                    </Style>
                                                                </Label.Style>
                                                            </Label>
                                                            <Label
                                                                Text="{x:Static localization:Strings.On}"
                                                                Grid.Column="1"
                                                                VerticalTextAlignment="Center"
                                                                >
                                                                <Label.Style>
                                                                    <Style TargetType="Label" BasedOn="{StaticResource LabelStyle}">
                                                                        <Setter Property="TextColor" Value="{DynamicResource White}"/>
                                                                        <Style.Triggers>
                                                                            <!-- Change button color if webcam is not enabled, but selected -->
                                                                            <MultiTrigger TargetType="Label">
                                                                                <MultiTrigger.Conditions>
                                                                                    <BindingCondition Binding="{Binding ShowImage}" Value="False"/>
                                                                                    <BindingCondition Binding="{Binding WebCamEnabled}" Value="False"/>
                                                                                </MultiTrigger.Conditions>
                                                                                <Setter Property="TextColor" Value="{DynamicResource PrimaryColor}"/>
                                                                            </MultiTrigger>
                                                                        </Style.Triggers>
                                                                    </Style>
                                                                </Label.Style>
                                                            </Label>
                                                        </Grid>
                                                    </buttons:SfButton.Content>
                                                    <buttons:SfButton.Style>
                                                        <Style TargetType="buttons:SfButton" BasedOn="{StaticResource SetupButtonStyle}">
                                                            <Setter Property="IsVisible" Value="False"/>
                                                            <Setter Property="TextColor" Value="{DynamicResource White}"/>
                                                            <Style.Triggers>
                                                                <MultiTrigger TargetType="buttons:SfButton">
                                                                    <MultiTrigger.Conditions>
                                                                        <BindingCondition Binding="{Binding WebCamEnabled}" Value="False"/>
                                                                        <BindingCondition Binding="{Binding ShowImage}" Value="False"/>
                                                                        <BindingCondition Binding="{Binding IsLoadingWebCamStream}" Value="False"/>
                                                                    </MultiTrigger.Conditions>
                                                                    <Setter Property="IsVisible" Value="True"/>
                                                                </MultiTrigger>

                                                                <!-- Change button color if image is empty -->
                                                                <MultiTrigger TargetType="buttons:SfButton">
                                                                    <MultiTrigger.Conditions>
                                                                        <BindingCondition Binding="{Binding ShowImage}" Value="True"/>
                                                                        <BindingCondition Binding="{Binding Thumbnail}" Value="{x:Null}"/>
                                                                    </MultiTrigger.Conditions>
                                                                    <Setter Property="TextColor" Value="{DynamicResource PrimaryColor}"/>
                                                                </MultiTrigger>
                                                                <!-- Change button color if webcam is not enabled, but selected -->
                                                                <MultiTrigger TargetType="buttons:SfButton">
                                                                    <MultiTrigger.Conditions>
                                                                        <BindingCondition Binding="{Binding ShowImage}" Value="False"/>
                                                                        <BindingCondition Binding="{Binding WebCamEnabled}" Value="False"/>
                                                                    </MultiTrigger.Conditions>
                                                                    <Setter Property="TextColor" Value="{DynamicResource PrimaryColor}"/>
                                                                </MultiTrigger>
                                                            </Style.Triggers>
                                                        </Style>
                                                    </buttons:SfButton.Style>
                                                </buttons:SfButton>

                                                <!-- Select webcam -->
                                                <buttons:SfButton 
                                                    VerticalOptions="Start"
                                                    Command="{Binding SelectWebCamIndexCommand}" 
                                                    TextColor="{DynamicResource White}"
                                                    Margin="5,5"
                                                    >
                                                    <buttons:SfButton.Style>
                                                        <Style TargetType="buttons:SfButton" BasedOn="{StaticResource RoundMaterialDesignIconButtonStyle}">
                                                            <Setter Property="Text" Value="{StaticResource MaterialDesign_CameraSwitchOutline}"/>
                                                            <Setter Property="IsVisible" Value="False"/>
                                                            <Setter Property="TextColor" Value="{DynamicResource White}"/>
                                                            <Style.Triggers>
                                                                <MultiTrigger TargetType="buttons:SfButton">
                                                                    <MultiTrigger.Conditions>
                                                                        <BindingCondition Binding="{Binding ShowImage}" Value="False"/>
                                                                        <BindingCondition Binding="{Binding WebCamEnabled}" Value="True"/>
                                                                    </MultiTrigger.Conditions>
                                                                    <Setter Property="IsVisible" Value="True"/>
                                                                </MultiTrigger>

                                                                <!-- Change button color if image is empty -->
                                                                <MultiTrigger TargetType="buttons:SfButton">
                                                                    <MultiTrigger.Conditions>
                                                                        <BindingCondition Binding="{Binding ShowImage}" Value="True"/>
                                                                        <BindingCondition Binding="{Binding Thumbnail}" Value="{x:Null}"/>
                                                                    </MultiTrigger.Conditions>
                                                                    <Setter Property="TextColor" Value="{DynamicResource PrimaryColor}"/>
                                                                </MultiTrigger>
                                                                <!-- Change button color if webcam is not enabled, but selected -->
                                                                <MultiTrigger TargetType="buttons:SfButton">
                                                                    <MultiTrigger.Conditions>
                                                                        <BindingCondition Binding="{Binding ShowImage}" Value="False"/>
                                                                        <BindingCondition Binding="{Binding WebCamEnabled}" Value="False"/>
                                                                    </MultiTrigger.Conditions>
                                                                    <Setter Property="TextColor" Value="{DynamicResource PrimaryColor}"/>
                                                                </MultiTrigger>
                                                            </Style.Triggers>
                                                        </Style>
                                                    </buttons:SfButton.Style>
                                                </buttons:SfButton>
                                            </Grid>

                                            <!-- Button bottom -->
                                            <!-- Grid.ColumnSpan="3" -->
                                            <Grid
                                                Margin="0,0,0,35"
                                                Grid.Row="1" 
                                                Grid.Column="1"
                                                IsVisible="{Binding ExpandTopView}"
                                                >
                                                <!-- Expander -->
                                                <border:SfBorder
                                                IsVisible="{Binding IsPrinting}"
                                                HorizontalOptions="Center"
                                                >
                                                    <border:SfBorder.Style>
                                                        <Style 
                                                TargetType="border:SfBorder">
                                                            <Setter Property="BackgroundColor" Value="{DynamicResource Transparent}"/>
                                                            <Setter Property="BorderWidth" Value="0"/>
                                                            <Style.Triggers>
                                                                <DataTrigger 
                                                        TargetType="border:SfBorder" 
                                                        Binding="{Binding ExpandPrintOptions}"
                                                        Value="True">
                                                                    <Setter Property="BackgroundColor" Value="{DynamicResource Gray-100}"/>
                                                                    <Setter Property="BorderWidth" Value="1"/>
                                                                </DataTrigger>
                                                            </Style.Triggers>
                                                        </Style>
                                                    </border:SfBorder.Style>
                                                    <StackLayout 
                                            Orientation="Horizontal">
                                                        <!-- Expand button -->
                                                        <buttons:SfButton 
                                                Text="{StaticResource MaterialDesign_NozzleOutline}" 
                                                Command="{Binding TogglePrintActionMenuCommand}" 
                                                HorizontalOptions="Center" 
                                                VerticalOptions="Start"
                                                TextColor="{DynamicResource White}"
                                                Margin="4,0"

                                                    >
                                                            <buttons:SfButton.Style>
                                                                <Style 
                                                        TargetType="buttons:SfButton"
                                                        BasedOn="{StaticResource RoundMaterialDesignIconButtonStyle}">
                                                                    <Setter Property="Text" Value="{StaticResource MaterialDesign_NozzleOutline}"/>
                                                                    <Style.Triggers>
                                                                        <DataTrigger TargetType="buttons:SfButton" Binding="{Binding ExpandPrintOptions}" Value="True">
                                                                            <Setter Property="Text" Value="{StaticResource MaterialDesign_ArrowCollapse}"/>
                                                                            <Setter Property="TextColor" Value="{DynamicResource Gray-Black}"/>
                                                                        </DataTrigger>
                                                                    </Style.Triggers>
                                                                </Style>
                                                            </buttons:SfButton.Style>
                                                        </buttons:SfButton>
                                                        <!-- Content -->
                                                        <StackLayout
                                                IsVisible="{Binding ExpandPrintOptions}"
                                                Orientation="Horizontal">
                                                            <!-- Pause button -->
                                                            <buttons:SfButton 
                                                        VerticalOptions="Start" HorizontalOptions="Center"  
                                                        Command="{Binding TogglePauseCommand}" 
                                                        TextColor="{DynamicResource Gray-Black}"
                                                        Margin="4,0"
                                                        >
                                                                <buttons:SfButton.Style>
                                                                    <Style TargetType="buttons:SfButton" BasedOn="{StaticResource RoundMaterialDesignIconButtonStyle}">
                                                                        <Setter Property="Text" Value="{StaticResource MaterialDesign_Pause}"/>
                                                                        <Setter Property="CommandParameter" Value="Pause"/>

                                                                        <Style.Triggers>
                                                                            <MultiTrigger TargetType="buttons:SfButton">
                                                                                <MultiTrigger.Conditions>
                                                                                    <BindingCondition Binding="{Binding IsPaused}" Value="True"/>
                                                                                </MultiTrigger.Conditions>
                                                                                <Setter Property="Text" Value="{StaticResource MaterialDesign_Play}"/>
                                                                                <Setter Property="CommandParameter" Value="Play"/>
                                                                            </MultiTrigger>
                                                                        </Style.Triggers>
                                                                    </Style>
                                                                </buttons:SfButton.Style>
                                                            </buttons:SfButton>

                                                            <!-- Stop button -->
                                                            <buttons:SfButton 
                                                    Text="{StaticResource MaterialDesign_Stop}" 
                                                    Command="{Binding CancelJobCommand}" 
                                                    Style="{StaticResource RoundMaterialDesignIconButtonStyle}"
                                                    HorizontalOptions="Center" 
                                                    VerticalOptions="Start"
                                                    TextColor="{DynamicResource Gray-Black}"
                                                    Margin="4,0"

                                                    />
                                                        </StackLayout>
                                                    </StackLayout>
                                                </border:SfBorder>
                                            </Grid>
                                        </Grid>

                                        <!-- Overlays
                                    <busyindicator:SfBusyIndicator 
                                        IsBusy="{Binding IsRestartingWebCamStream}"
                                        Style="{StaticResource LoadingBusyIndicatorStyle}"
                                        BackgroundColor="{DynamicResource Gray-100}"
                                        Title="{x:Static localization:Strings.Restart}"
                                        /> -->
                                    </Grid>
                                </PullToRefresh:SfPullToRefresh.PullableContent>
                            </PullToRefresh:SfPullToRefresh>
                        </Grid>
                    </tabView:SfTabItem.Content>
                </tabView:SfTabItem>

                <!-- Offline -->
                <tabView:SfTabItem 
                    Title="{x:Static localization:Strings.PrinterOffline}"
                    IconFont="{StaticResource MaterialDesign_LinkVariantOff}"
                    Style="{StaticResource SmallTabViewItemDefaultStyle}"
                    IsVisible="{Binding IsPrinterOnline, Converter={StaticResource BooleanReverseVisibilityConverter}}"
                    >
                    <tabView:SfTabItem.Content>
                        <Grid
                            CompressedLayout.IsHeadless="True"
                            >

                        </Grid>
                    </tabView:SfTabItem.Content>
                </tabView:SfTabItem>
            </tabView:SfTabView>
        </Grid>

        <!-- Overlays -->
        <busyindicator:SfBusyIndicator 
            IsBusy="{Binding IsRefreshing}"
            Style="{StaticResource LoadingBusyIndicatorStyle}"
            BackgroundColor="{DynamicResource Gray-100}"
            />
    </Grid>
</ContentPage>
jfversluis commented 2 years ago

Hm interesting. This seems to be consistent with what is mentioned on the Apple Forums where people report it happens on a phone but not a tablet and/or disable the animation

AndreasReitberger commented 6 months ago

@jfversluis Any news on this one? Thank you :)