locked
How to speed up rendering Views? RRS feed

  • Question

  • User390017 posted

    I'd like to create a calendar-like functionality, so i have a ScrollView with 12 Labels, 12 Grids, ~365 Frames inside the Grids and ~365 Labels inside the Frames...

    Running on a Galaxy S10 or above, it is fairly fast, but on anything weaker, well it's shit! After the rendering completes, the scrolling is smooth, but to have the page loaded sometimes take 6-7 seconds! :(

    Is there any way to speed up the rendering of frames, or to re-use one frame for the entire page?

    Thank you!

    Monday, March 2, 2020 8:27 AM

All replies

  • User74 posted

    How are you creating the 365 frames and labels? Code or XAML?

    I am presuming not all 365 frames will be visible at the same time, so the 12 grids could be virtualised into ListView rows, that way it will only create the rows that are visible until you scroll.

    Another suggestion is to create a custom control to replace each row and drop into a custom renderer on each platform to physically draw the contents of each month.

    Monday, March 2, 2020 8:32 AM
  • User390017 posted

    @JohnH said: How are you creating the 365 frames and labels? Code or XAML?

    I am presuming not all 365 frames will be visible at the same time, so the 12 grids could be virtualised into ListView rows, that way it will only create the rows that are visible until you scroll.

    Another suggestion is to create a custom control to replace each row and drop into a custom renderer on each platform to physically draw the contents of each month.

    Currenty, i'm creating everything from code, however i can place them into a ListView, i didn't know about that in that case, it won't be rendered at once :open_mouth:

    Thank you for your help!

    Monday, March 2, 2020 9:56 AM
  • User74 posted

    Excellent, let us know how you get on! Don't forget that for the virtualisation you will need 1 row per month, not 1 big cell containing 12 months.

    Monday, March 2, 2020 10:18 AM
  • User76049 posted

    Also, enabling compiled bindings will give you a significant view creation performance increase on bindings (7-10%) as reflection is very costly, especially on Android and loewer end windows devices.

    https://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/data-binding/compiled-bindings

    Also worth watch Jason's talk and the tips in this page https://docs.microsoft.com/en-us/xamarin/xamarin-forms/deploy-test/performance

    Those UI elements without virtualisation will have a performance impact as John correctly suggestions, also doing calculation/logic work of the UI thread and only using the UI thread for renderering work will help matters, doing work in the page constructor or before the page is pushed will slow down navigation.

    Monday, March 2, 2020 10:50 AM
  • User390017 posted

    @JohnH said: Excellent, let us know how you get on! Don't forget that for the virtualisation you will need 1 row per month, not 1 big cell containing 12 months.

    Right now, my problem is the ViewCell! The ItemsSource of the ListView is a List(Grid), so what should i put into the ItemTemplate?

    Monday, March 2, 2020 11:51 AM
  • User74 posted

    Ah, you need to read up on that. Straight from the MS site: https://docs.microsoft.com/en-gb/samples/xamarin/xamarin-forms-samples/userinterface-listview-customcells/

    Monday, March 2, 2020 12:22 PM
  • User390017 posted

    Well, i did it this way:

            <ListView.ItemTemplate>
    
                <DataTemplate>
    
                    <ViewCell>
    
                        <ViewCell.View>
    
                            <ContentView Content="{Binding}" />
    
                        </ViewCell.View>
    
                    </ViewCell>
    
                </DataTemplate>
    
            </ListView.ItemTemplate>
    
        </ListView>
    

    The performance is just horrible, the rendering seems to be faster about1-2 seconds, but the scrolling :open_mouth: , i can't even scroll it, it freezes :cry:

    Monday, March 2, 2020 12:23 PM
  • User74 posted

    Are you binding the content view? I wouldn't do that. Start with a grid with column definitions bound to the number of days in the month.

    Monday, March 2, 2020 12:29 PM
  • User390017 posted

    @JohnH said: Are you binding the content view? I wouldn't do that. Start with a grid with column definitions bound to the number of days in the month.

    Yes but, as i have said, i create the grids in code... If i make a Grid template with 35 cells and 35 Frames and 35 labels, then i would need 35 bindings just for background colors and other 35 just for the labels, and always check if that cell is actually represents a day or not, this is so easy from code, i can't believe the performance has to be this shit, what about 3D games that are running smoothly? This is just some frames we are talking about... :cry:

    Monday, March 2, 2020 12:32 PM
  • User74 posted

    You wouldn't do 3d games in Xamarin Forms. Bindings is the way to do this, what would be the issue with using bindings? AS @NMackay said you can use compiled bindings for super quick performance.

    Monday, March 2, 2020 12:41 PM
  • User390017 posted

    @JohnH said: You wouldn't do 3d games in Xamarin Forms. Bindings is the way to do this, what would be the issue with using bindings? AS @NMackay said you can use compiled bindings for super quick performance.

    All right, i have tried! As you can see, i finished only the first to rows, 10 frames, 10 labels. Tha page load is just the same, and the scrolling is horrible, really horrible! i don't know what to do! :cry:

            <ListView.ItemTemplate>
    
                <DataTemplate>
    
                    <ViewCell>
    
                        <ViewCell.View>
    
                            <Grid ColumnSpacing="5"
                                  HorizontalOptions="Fill"
                                  Margin="20, 0, 20, 20"
                                  Padding="0"
                                  RowSpacing="5"
                                  VerticalOptions="Start">
    
                                <Grid.ColumnDefinitions>
    
                                    <ColumnDefinition />
                                    <ColumnDefinition />
                                    <ColumnDefinition />
                                    <ColumnDefinition />
                                    <ColumnDefinition />
                                    <ColumnDefinition />
                                    <ColumnDefinition />
    
                                </Grid.ColumnDefinitions>
    
                                <Grid.RowDefinitions>
    
                                    <RowDefinition />
                                    <RowDefinition />
                                    <RowDefinition />
                                    <RowDefinition />
                                    <RowDefinition />
                                    <RowDefinition Height="Auto" />
    
                                </Grid.RowDefinitions>
    
                                <Frame BackgroundColor="{Binding BackgroundColor}"
                                       CornerRadius="5"
                                       Padding="0"
                                       Grid.Column="0"
                                       Grid.Row="0">
    
                                    <Label FontSize="Small"
                                           HorizontalOptions="End"
                                           Margin="0, 5, 5, 0"
                                           Text="{Binding Day}"
                                           VerticalOptions="Start" />
    
                                </Frame>
    
                                <Frame BackgroundColor="{Binding BackgroundColor}"
                                       CornerRadius="5"
                                       Padding="0"
                                       Grid.Column="1"
                                       Grid.Row="0">
    
                                    <Label FontSize="Small"
                                           HorizontalOptions="End"
                                           Margin="0, 5, 5, 0"
                                           Text="{Binding Day}"
                                           VerticalOptions="Start" />
    
                                </Frame>
    
                                <Frame BackgroundColor="{Binding BackgroundColor}"
                                       CornerRadius="5"
                                       Padding="0"
                                       Grid.Column="2"
                                       Grid.Row="0">
    
                                    <Label FontSize="Small"
                                           HorizontalOptions="End"
                                           Margin="0, 5, 5, 0"
                                           Text="{Binding Day}"
                                           VerticalOptions="Start" />
    
                                </Frame>
    
                                <Frame BackgroundColor="{Binding BackgroundColor}"
                                       CornerRadius="5"
                                       Padding="0"
                                       Grid.Column="3"
                                       Grid.Row="0">
    
                                    <Label FontSize="Small"
                                           HorizontalOptions="End"
                                           Margin="0, 5, 5, 0"
                                           Text="{Binding Day}"
                                           VerticalOptions="Start" />
    
                                </Frame>
    
                                <Frame BackgroundColor="{Binding BackgroundColor}"
                                       CornerRadius="5"
                                       Padding="0"
                                       Grid.Column="4"
                                       Grid.Row="0">
    
                                    <Label FontSize="Small"
                                           HorizontalOptions="End"
                                           Margin="0, 5, 5, 0"
                                           Text="{Binding Day}"
                                           VerticalOptions="Start" />
    
                                </Frame>
    
                                <Frame BackgroundColor="{Binding BackgroundColor}"
                                       CornerRadius="5"
                                       Padding="0"
                                       Grid.Column="5"
                                       Grid.Row="0">
    
                                    <Label FontSize="Small"
                                           HorizontalOptions="End"
                                           Margin="0, 5, 5, 0"
                                           Text="{Binding Day}"
                                           VerticalOptions="Start" />
    
                                </Frame>
    
                                <Frame BackgroundColor="{Binding BackgroundColor}"
                                       CornerRadius="5"
                                       Padding="0"
                                       Grid.Column="6"
                                       Grid.Row="0">
    
                                    <Label FontSize="Small"
                                           HorizontalOptions="End"
                                           Margin="0, 5, 5, 0"
                                           Text="{Binding Day}"
                                           VerticalOptions="Start" />
    
                                </Frame>
    
                                <Frame BackgroundColor="{Binding BackgroundColor}"
                                       CornerRadius="5"
                                       Padding="0"
                                       Grid.Column="0"
                                       Grid.Row="1">
    
                                    <Label FontSize="Small"
                                           HorizontalOptions="End"
                                           Margin="0, 5, 5, 0"
                                           Text="{Binding Day}"
                                           VerticalOptions="Start" />
    
                                </Frame>
    
                                <Frame BackgroundColor="{Binding BackgroundColor}"
                                       CornerRadius="5"
                                       Padding="0"
                                       Grid.Column="1"
                                       Grid.Row="1">
    
                                    <Label FontSize="Small"
                                           HorizontalOptions="End"
                                           Margin="0, 5, 5, 0"
                                           Text="{Binding Day}"
                                           VerticalOptions="Start" />
    
                                </Frame>
    
                                <Frame BackgroundColor="{Binding BackgroundColor}"
                                       CornerRadius="5"
                                       Padding="0"
                                       Grid.Column="2"
                                       Grid.Row="1">
    
                                    <Label FontSize="Small"
                                           HorizontalOptions="End"
                                           Margin="0, 5, 5, 0"
                                           Text="{Binding Day}"
                                           VerticalOptions="Start" />
    
                                </Frame>
    
                                <Frame BackgroundColor="{Binding BackgroundColor}"
                                       CornerRadius="5"
                                       Padding="0"
                                       Grid.Column="3"
                                       Grid.Row="1">
    
                                    <Label FontSize="Small"
                                           HorizontalOptions="End"
                                           Margin="0, 5, 5, 0"
                                           Text="{Binding Day}"
                                           VerticalOptions="Start" />
    
                                </Frame>
    
                                <Frame BackgroundColor="{Binding BackgroundColor}"
                                       CornerRadius="5"
                                       Padding="0"
                                       Grid.Column="4"
                                       Grid.Row="1">
    
                                    <Label FontSize="Small"
                                           HorizontalOptions="End"
                                           Margin="0, 5, 5, 0"
                                           Text="{Binding Day}"
                                           VerticalOptions="Start" />
    
                                </Frame>
    
                                <Frame BackgroundColor="{Binding BackgroundColor}"
                                       CornerRadius="5"
                                       Padding="0"
                                       Grid.Column="5"
                                       Grid.Row="1">
    
                                    <Label FontSize="Small"
                                           HorizontalOptions="End"
                                           Margin="0, 5, 5, 0"
                                           Text="{Binding Day}"
                                           VerticalOptions="Start" />
    
                                </Frame>
    
                                <Frame BackgroundColor="{Binding BackgroundColor}"
                                       CornerRadius="5"
                                       Padding="0"
                                       Grid.Column="6"
                                       Grid.Row="1">
    
                                    <Label FontSize="Small"
                                           HorizontalOptions="End"
                                           Margin="0, 5, 5, 0"
                                           Text="{Binding Day}"
                                           VerticalOptions="Start" />
    
                                </Frame>
    
                            </Grid>
    
                        </ViewCell.View>
    
                    </ViewCell>
    
                </DataTemplate>
    
            </ListView.ItemTemplate>
    
        </ListView>
    
    Monday, March 2, 2020 1:37 PM
  • User390017 posted

    @JohnH said: You wouldn't do 3d games in Xamarin Forms. Bindings is the way to do this, what would be the issue with using bindings? AS @NMackay said you can use compiled bindings for super quick performance.

    Also, this is my problem, i have to create a shitload of views which are basically the same, there is no for loop or something, the XAML is unreadable, and i didn't do half yet :disappointed:

    Monday, March 2, 2020 1:38 PM
  • User74 posted

    You have done exactly what I said not to. You are attempting to put the entire 12 months into a single cell, which means it wont be visualised. The cell should be for a single month, so 1 row in your grid. Your model contains a collection of month models etc.

    Monday, March 2, 2020 1:44 PM
  • User390017 posted

    @JohnH said: You have done exactly what I said not to. You are attempting to put the entire 12 months into a single cell, which means it wont be visualised. The cell should be for a single month, so 1 row in your grid. Your model contains a collection of month models etc.

    Then i don't know what do you mean... i put 1 grid into the viewcell, i need 1 grid for each month :confused:

    Monday, March 2, 2020 1:57 PM
  • User74 posted

    Then there might be some miscommunication, why does your view cell contain a grid with many rows?

    Monday, March 2, 2020 2:01 PM
  • User390017 posted

    @JohnH said: Then there might be some miscommunication, why does your view cell contain a grid with many rows?

    1 row represent 1 week, and each week has 7 days, but if the 1st of the month is on say Saturday, and the month has 31 days, then i need 6 rows to represent it.

    this is what i created from code, and i need this for every month:

    Monday, March 2, 2020 2:12 PM
  • User74 posted

    Ah I see! A picture speaks a thousand words! I would personally make each week a ViewCell with its appropriate week model. reduces the masses of duplication you are having.

    Monday, March 2, 2020 2:22 PM
  • User390017 posted

    @JohnH said: Ah I see! A picture speaks a thousand words! I would personally make each week a ViewCell with its appropriate week model. reduces the masses of duplication you are having.

    Okay, but i need 12 of this, and 12 labels with the name of the month, that separates them, also i dont have week models, i have a large list with datetimes, if a specific day has is datetime in the list, i need to color the frame.

    Also, if i do this from code, i just skip the frames where i dont need them, but if i do it from XAML, i need 42 frames for each month :disappointed:

    i'm sorry, maybe i'm the week link here, but i dont understand how to do this from XAML, so basically, i need this to be much more faster:

    This is a screenshot taken on my S10, it is okay there, but i need to serve much slower phones :(

    Monday, March 2, 2020 2:33 PM
  • User74 posted

    You can do this in code (which is my preferred method).

    You don't need 12 of this, you need an item template to cover a single week. You model will have an observable collection of week models that inform the item template how it should display.

    Also, list view has a grouping option so you group on a month header. But I would get this part working first.

    Monday, March 2, 2020 2:40 PM
  • User3516 posted

    To show the name of the month you can use grouping in the listview: https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/listview/customizing-list-appearance#grouping

    Monday, March 2, 2020 2:41 PM
  • User390017 posted

    @JohnH said: You can do this in code (which is my preferred method).

    You don't need 12 of this, you need an item template to cover a single week. You model will have an observable collection of week models that inform the item template how it should display.

    Also, list view has a grouping option so you group on a month header. But I would get this part working first.

    All right, so i need an observable collection with 53 element, representing each week?

    (Also, what is this autmatic draft saving function here that hags the UI for seconds?) :open_mouth:

    Monday, March 2, 2020 2:46 PM
  • User74 posted

    That isn't a single screenshot though right? You wont have all 12 months showing at the same time. Hence virtualisation is the key.

    The attached screenshot shows a vertically scrolling month view, grouped on a month header, virtualized to scroll to infinity, with calendar event data displayed.


    Monday, March 2, 2020 2:51 PM
  • User390017 posted

    @JohnH said: That isn't a single screenshot though right? You wont have all 12 months showing at the same time. Hence virtualisation is the key.

    The attached screenshot shows a vertically scrolling month view, grouped on a month header, virtualized to scroll to infinity, with calendar event data displayed.

    No, it is a single screenshot, took with the scrolling screenshot feature on my S10, but nevertheless, every month is on the same page in a scrollview, unfortunately, i need to display them this way.

    Monday, March 2, 2020 3:39 PM
  • User74 posted

    Sure, that doesn’t change what I have suggested.

    Monday, March 2, 2020 3:50 PM
  • User390017 posted

    @JohnH said: Sure, that doesn’t change what I have suggested.

    I will try it, thank you!

    Monday, March 2, 2020 4:06 PM
  • User390017 posted

    Okay, i believe i did everything you suggested, needless to say, the scrolling performance is just horrible :neutral: same as before... any more tips?

        <ListView HorizontalOptions="FillAndExpand"
                      ItemsSource="{Binding Weeks}"
                      SeparatorVisibility="None"
                      VerticalOptions="FillAndExpand">
    
                <ListView.ItemTemplate>
    
                    <DataTemplate x:DataType="ms:WeekModel">
    
                        <ViewCell>
    
                            <ViewCell.View>
    
                                <Grid ColumnSpacing="5"
                                      HorizontalOptions="Fill"
                                      Margin="20, 5, 20, 0"
                                      Padding="0"
                                      RowSpacing="5"
                                      VerticalOptions="Start">
    
                                    <Grid.ColumnDefinitions>
    
                                        <ColumnDefinition />
                                        <ColumnDefinition />
                                        <ColumnDefinition />
                                        <ColumnDefinition />
                                        <ColumnDefinition />
                                        <ColumnDefinition />
                                        <ColumnDefinition />
    
                                    </Grid.ColumnDefinitions>
    
                                    <Frame BackgroundColor="{Binding Monday.Index, Converter={StaticResource BackgroundColorConverter}}"
                                           CornerRadius="5"
                                           IsVisible="{Binding Monday, Converter={StaticResource VisibilityConverter}}"
                                           Padding="0"
                                           Grid.Column="0"
                                           Grid.Row="0">
    
                                        <Label FontSize="Small"
                                               HorizontalOptions="End"
                                               Margin="0, 5, 5, 0"
                                               Text="{Binding Monday.Day}"
                                               VerticalOptions="Start" />
    
                                    </Frame>
    
                                    <Frame BackgroundColor="{Binding Tuesday.Index, Converter={StaticResource BackgroundColorConverter}}"
                                           CornerRadius="5"
                                           IsVisible="{Binding Tuesday, Converter={StaticResource VisibilityConverter}}"
                                           Padding="0"
                                           Grid.Column="1"
                                           Grid.Row="0">
    
                                        <Label FontSize="Small"
                                               HorizontalOptions="End"
                                               Margin="0, 5, 5, 0"
                                               Text="{Binding Tuesday.Day}"
                                               VerticalOptions="Start" />
    
                                    </Frame>
    
                                    <Frame BackgroundColor="{Binding Wednesday.Index, Converter={StaticResource BackgroundColorConverter}}"
                                           CornerRadius="5"
                                           IsVisible="{Binding Wednesday, Converter={StaticResource VisibilityConverter}}"
                                           Padding="0"
                                           Grid.Column="2"
                                           Grid.Row="0">
    
                                        <Label FontSize="Small"
                                               HorizontalOptions="End"
                                               Margin="0, 5, 5, 0"
                                               Text="{Binding Wednesday.Day}"
                                               VerticalOptions="Start" />
    
                                    </Frame>
    
                                    <Frame BackgroundColor="{Binding Thursday.Index, Converter={StaticResource BackgroundColorConverter}}"
                                           CornerRadius="5"
                                           IsVisible="{Binding Thursday, Converter={StaticResource VisibilityConverter}}"
                                           Padding="0"
                                           Grid.Column="3"
                                           Grid.Row="0">
    
                                        <Label FontSize="Small"
                                               HorizontalOptions="End"
                                               Margin="0, 5, 5, 0"
                                               Text="{Binding Thursday.Day}"
                                               VerticalOptions="Start" />
    
                                    </Frame>
    
                                    <Frame BackgroundColor="{Binding Friday.Index, Converter={StaticResource BackgroundColorConverter}}"
                                           CornerRadius="5"
                                           IsVisible="{Binding Friday, Converter={StaticResource VisibilityConverter}}"
                                           Padding="0"
                                           Grid.Column="4"
                                           Grid.Row="0">
    
                                        <Label FontSize="Small"
                                               HorizontalOptions="End"
                                               Margin="0, 5, 5, 0"
                                               Text="{Binding Friday.Day}"
                                               VerticalOptions="Start" />
    
                                    </Frame>
    
                                    <Frame BackgroundColor="{Binding Saturday.Index, Converter={StaticResource BackgroundColorConverter}}"
                                           CornerRadius="5"
                                           IsVisible="{Binding Saturday, Converter={StaticResource VisibilityConverter}}"
                                           Padding="0"
                                           Grid.Column="5"
                                           Grid.Row="0">
    
                                        <Label FontSize="Small"
                                               HorizontalOptions="End"
                                               Margin="0, 5, 5, 0"
                                               Text="{Binding Saturday.Day}"
                                               VerticalOptions="Start" />
    
                                    </Frame>
    
                                    <Frame BackgroundColor="{Binding Sunday.Index, Converter={StaticResource BackgroundColorConverter}}"
                                           CornerRadius="5"
                                           IsVisible="{Binding Sunday, Converter={StaticResource VisibilityConverter}}"
                                           Padding="0"
                                           Grid.Column="6"
                                           Grid.Row="0">
    
                                        <Label FontSize="Small"
                                               HorizontalOptions="End"
                                               Margin="0, 5, 5, 0"
                                               Text="{Binding Sunday.Day}"
                                               VerticalOptions="Start" />
    
                                    </Frame>
    
                                </Grid>
    
                            </ViewCell.View>
    
                        </ViewCell>
    
                    </DataTemplate>
    
                </ListView.ItemTemplate>
    
            </ListView>
    
    Tuesday, March 3, 2020 11:25 AM
  • User390017 posted

    Follow up, setting CachingStrategy="RecycleElementAndDataTemplate" on the ListView seems to improve scrolling performance, i removed the compiled bindings, either it has no effect or i implemented it wrong :disappointed:

    Tuesday, March 3, 2020 11:54 AM
  • User390017 posted

    About grouping, if i implement this:

    `

                <DataTemplate x:DataType="ms:WeekModel">
    
                    <ViewCell>
    
                        <ViewCell.View>
    
                            <Label Text="{Binding Month}" />
    
                        </ViewCell.View>
    
                    </ViewCell>
    
                </DataTemplate>
    

    `

    and set IsGroupingEnabled="True" on the ListView, nothing displays :confused:

    Tuesday, March 3, 2020 12:04 PM
  • User74 posted

    When using grouped by, your item models need to be grouped also. Take a look at this Xamarin example: https://github.com/xamarin/xamarin-forms-samples/blob/master/UserInterface/ListView/Grouping/groupingSampleListView/groupingSampleListView/ViewModel/veggieModel.cs

    Also, as you are using XAML make sure you have XAMLC enabled: https://docs.microsoft.com/en-us/xamarin/xamarin-forms/xaml/xamlc

    Tuesday, March 3, 2020 1:41 PM
  • User76049 posted

    Can always use this for free if you apply for the community licence https://help.syncfusion.com/xamarin/calendar/getting-started

    Tuesday, March 3, 2020 2:27 PM
  • User390017 posted

    @JohnH said: When using grouped by, your item models need to be grouped also. Take a look at this Xamarin example: https://github.com/xamarin/xamarin-forms-samples/blob/master/UserInterface/ListView/Grouping/groupingSampleListView/groupingSampleListView/ViewModel/veggieModel.cs

    Also, as you are using XAML make sure you have XAMLC enabled: https://docs.microsoft.com/en-us/xamarin/xamarin-forms/xaml/xamlc

    Thank you, i'll try this! XAMLC is enabled by default, at least the VS marks every class created with it...

    Tuesday, March 3, 2020 5:20 PM
  • User390017 posted

    @NMackay said: Can always use this for free if you apply for the community licence https://help.syncfusion.com/xamarin/calendar/getting-started

    Thank you, i will try it if there will be nothing else left, but it is a shame, how can be the X.F so much shit...

    Tuesday, March 3, 2020 5:21 PM
  • User74 posted

    Careful, I find your last post offensive. You just need to know how to write performant code, learn how to get the most out of the tools you are using.

    Tuesday, March 3, 2020 6:28 PM
  • User390017 posted

    @JohnH said: Careful, I find your last post offensive. You just need to know how to write performant code, learn how to get the most out of the tools you are using.

    Well maybe it is offensive, but not towards you guys and i hope you don't take it personally! I believe the syncfusion guys also had to create their own renderers, not using Forms for obvious reasons, hence my opinion!

    Wednesday, March 4, 2020 7:37 AM
  • User74 posted

    I didn't take it personally, but you are saying the product is sh*t when it isn't, and that is what I find offensive. I write highly performant apps using Xamarin Forms. It is about understanding the platforms that will be running my apps, and the tools I use to achieve that. I'm going to step away from this thread now, I hope you find the right solution for your needs.

    Wednesday, March 4, 2020 9:33 AM