Open AndreasReitberger opened 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!
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 :)
Sure, I'll give it a try and report back 😊
@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.
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>
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
@jfversluis Any news on this one? Thank you :)
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 callawait 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 onawait Shell.Current.GoToAsync(MyPage, false);