代码之家  ›  专栏  ›  技术社区  ›  Alireza

CollectionView在.net maui中使用延迟

  •  0
  • Alireza  · 技术社区  · 1 年前

    我在.net maui中创建了这个简单的应用程序,并使用了CollectionView和SwipeGestureRecognizer 用于在月份之间切换。 问题是该应用程序运行速度非常慢。当我向右或向左滑动时,延迟3/4秒后更改月份。

    我如何才能修复它,或者我可以使用其他方法来制作这个应用程序?

    以下是xaml代码:

    <ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:dxco="clr-namespace:DevExpress.Maui.Controls;assembly=DevExpress.Maui.Controls" xmlns:dxc="clr-namespace:DevExpress.Maui.Charts;assembly=DevExpress.Maui.Charts" xmlns:dxcv="clr-namespace:DevExpress.Maui.CollectionView;assembly=DevExpress.Maui.CollectionView" xmlns:dxsch="clr-namespace:DevExpress.Maui.Scheduler;assembly=DevExpress.Maui.Scheduler" xmlns:dxg="clr-namespace:DevExpress.Maui.DataGrid;assembly=DevExpress.Maui.DataGrid" xmlns:dxe="clr-namespace:DevExpress.Maui.Editors;assembly=DevExpress.Maui.Editors" xmlns:dxdf="clr-namespace:DevExpress.Maui.DataForm;assembly=DevExpress.Maui.Editors" xmlns:ios="clr-namespace:Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific;assembly=Microsoft.Maui.Controls" ios:Page.UseSafeArea="true" x:Class= "Calendar.MainPage">
        <ContentView>
            <ContentView.GestureRecognizers>
                <SwipeGestureRecognizer Direction="Right" Command="{Binding SwipeRightCommand}" />
                <SwipeGestureRecognizer Direction="Left" Command="{Binding SwipeLeftCommand}" />
            </ContentView.GestureRecognizers>
            <Grid BackgroundColor="#fff">
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="*" />
                </Grid.RowDefinitions>
    
                <Label Text="{Binding MonthYearLabel}" HorizontalOptions="Center" VerticalOptions="Start" 
               FontSize="24" TextColor="#333" Margin="0,10,0,2" Grid.Row="0"/>
    
                <Grid Grid.Row="1">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition />
                        <ColumnDefinition />
                        <ColumnDefinition />
                        <ColumnDefinition />
                        <ColumnDefinition />
                        <ColumnDefinition />
                        <ColumnDefinition />
                    </Grid.ColumnDefinitions>
                    <Label Text="friday" TextColor="#f2291b" HorizontalOptions="Center" Grid.Column="0"/>
                    <Label Text="thursday" TextColor="#666" HorizontalOptions="Center" Grid.Column="1"/>
                    <Label Text="wednesday" TextColor="#666" HorizontalOptions="Center" Grid.Column="2"/>
                    <Label Text="tueseday" TextColor="#666" HorizontalOptions="Center" Grid.Column="3"/>
                    <Label Text="monday" TextColor="#666" HorizontalOptions="Center" Grid.Column="4"/>
                    <Label Text="sunday" TextColor="#666" HorizontalOptions="Center" Grid.Column="5"/>
                    <Label Text="saturday" TextColor="#666" HorizontalOptions="Center" Grid.Column="6"/>
                </Grid>
    
                <CollectionView Grid.Row="2" ItemsSource="{Binding Days}" SelectionMode="None">
                    <CollectionView.ItemsLayout>
                        <GridItemsLayout Orientation="Vertical" Span="7" />
                    </CollectionView.ItemsLayout>
                    <CollectionView.ItemTemplate>
                        <DataTemplate>
                            <Frame BorderColor="#DDD" BackgroundColor="{Binding BackgroundColor}" Padding="10" CornerRadius="5" HasShadow="True">
                                <StackLayout Orientation="Vertical" HorizontalOptions="Center" VerticalOptions="Center">
                                    <Label Text="{Binding SolarDay}" TextColor="{Binding TextColor}" FontSize="18" HorizontalOptions="CenterAndExpand" />
                                    <StackLayout Orientation="Horizontal" HorizontalOptions="Center" VerticalOptions="End">
                                        <!--<Label Text="{Binding AdDay}" Margin="0,5,7,0" TextColor="{Binding TextColor}" FontSize="12" HorizontalOptions="End" />
                                <Label Text="{Binding LunarDay}" Margin="7,5,0,0" TextColor="{Binding TextColor}" FontSize="12" HorizontalOptions="Start" />-->
                                    </StackLayout>
                                </StackLayout>
                            </Frame>
                        </DataTemplate>
                    </CollectionView.ItemTemplate>
                </CollectionView>
            </Grid>
        </ContentView>
    </ContentPage>
    

    这里是C#代码:

    using System.Collections.ObjectModel;
    using System.Windows.Input;
    
    namespace Calendar
    {
        public partial class MainPage : ContentPage
        {
            private PersianDateTime currentDate;
            private ObservableCollection<DayModel> days;
            public ObservableCollection<DayModel> Days
            {
                get => days;
                set
                {
                    days = value;
                    OnPropertyChanged();
                }
            }
    
            public ICommand SwipeRightCommand => new Command(ShowNextMonth);
            public ICommand SwipeLeftCommand => new Command(ShowPreviousMonth);
    
            public string MonthYearLabel
            {
                get => currentDate.ToString("MMMM yyyy");
            }
    
            public MainPage()
            {
                InitializeComponent();
    
                currentDate = PersianDateTime.Now;
                Days = new ObservableCollection<DayModel>(GenerateCalendar(currentDate).Cast<DayModel>().ToList());
                BindingContext = this;
            }
    
            private void ShowPreviousMonth()
            {
                currentDate = currentDate.AddMonths(-1);
                Days = new ObservableCollection<DayModel>(GenerateCalendar(currentDate).Cast<DayModel>().ToList());
                OnPropertyChanged(nameof(MonthYearLabel));
            }
    
            private void ShowNextMonth()
            {
                currentDate = currentDate.AddMonths(1);
                Days = new ObservableCollection<DayModel>(GenerateCalendar(currentDate).Cast<DayModel>().ToList());
                OnPropertyChanged(nameof(MonthYearLabel));
            }
    
            private DayModel[,] GenerateCalendar(PersianDateTime date)
            {
                var daysInMonth = PersianDateTime.GetDaysInMonth(date.Year, date.Month);
                var firstDayOfMonth = new PersianDateTime(date.Year, date.Month, 1);
                int offset = firstDayOfMonth.DayOfWeek;
                var dayModels = new DayModel[(int)Math.Ceiling((daysInMonth + offset) / 7.0), 7];
    
                int currentDay = 1;
    
                for (int row = 0; row < dayModels.GetLength(0); row++)
                {
                    for (int col = dayModels.GetLength(1) - 1; col >= 0; col--)
                    {
                        if (row == 0 && col > 6 - offset)
                        {
                            dayModels[row, col] = new DayModel
                            {
                                SolarDay = 0,
                                BackgroundColor = Color.FromRgba("#ffffff"),
                                TextColor = Color.FromRgba("#ffffff")
                            };
                        }
                        else if (currentDay <= daysInMonth)
                        {
                            dayModels[row, col] = new DayModel
                            {
                                SolarDay = currentDay,
                                BackgroundColor = Color.FromRgba("#ffffff"),
                                TextColor = Color.FromRgba("#000000")
                            };
                            currentDay++;
                        }
                    }
                }
    
                return dayModels;
            }
        }
    }
    
    
    
    
    
    
    

    问题也不是PersianDateTime-Nuget包的原因,我尝试了System.Globalization.Calendars,但问题仍然存在。

    0 回复  |  直到 1 年前