我在.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,但问题仍然存在。