C# maui listview observablecollection 動態新增/修改/刪除/更新UI
C# maui listview observablecollection 動態新增/修改/刪除/更新UI
XAML
<?xml version="1.0" encoding="utf-8" ?> <ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:local="clr-namespace:VPOS.CustomControls" x:Class="VPOS.MainPage" Background="#194a6e" Title=""><!-- 隱藏標題 --> <Grid x:Name="FullGrid" Padding="3" RowSpacing="2" ColumnSpacing="2" > <Grid.RowDefinitions> <RowDefinition /><!--Workspace --> <RowDefinition Height="40" /><!--status column --> </Grid.RowDefinitions> <Grid x:Name="WorkspaceGrid" RowSpacing="2" ColumnSpacing="2" Grid.Row="0" Grid.Column="0"> <Grid.ColumnDefinitions> <ColumnDefinition Width="50"/><!-- Menu --> <ColumnDefinition /><!-- Content --> </Grid.ColumnDefinitions> <Grid x:Name="MenuGrid" RowSpacing="2" ColumnSpacing="2" Grid.Row="0" Grid.Column="0"> <Border x:Name="MenuBorder" Stroke="#194a6e" StrokeThickness="0" Background="#194a6e"> <Border.StrokeShape> <RoundRectangle CornerRadius="5" /> </Border.StrokeShape> <VerticalStackLayout Spacing="5"> <ImageButton x:Name="SettingsBtn" BorderColor="White" BorderWidth="2" CornerRadius="5" BackgroundColor="#194a6e" Source = "settings.png" Clicked="SettingsBtn_Clicked" HorizontalOptions="Fill" VerticalOptions="Fill"> </ImageButton> <ImageButton x:Name="DevicesBtn" BorderColor="White" BorderWidth="2" CornerRadius="5" BackgroundColor="#194a6e" Source = "device.png" Clicked="DevicesBtn_Clicked" HorizontalOptions="Fill" VerticalOptions="Fill"> </ImageButton> <ImageButton x:Name="SynchronizeBtn" BorderColor="White" BorderWidth="2" CornerRadius="5" BackgroundColor="#194a6e" Source = "synchronize.png" Clicked="SynchronizeBtn_Clicked" HorizontalOptions="Fill" VerticalOptions="Fill"> </ImageButton> <ImageButton x:Name="LogoutBtn" BorderColor="White" BorderWidth="2" CornerRadius="5" BackgroundColor="#194a6e" Source = "logout.png" Clicked="LogoutBtn_Clicked" HorizontalOptions="Fill" VerticalOptions="Fill"> </ImageButton> </VerticalStackLayout> </Border><!--MenuBorder--> </Grid><!--MenuGrid--> <Grid x:Name="ContentGrid" RowSpacing="2" ColumnSpacing="2" Grid.Row="0" Grid.Column="1" ColumnDefinitions="5.2*,0.8*,6*"> <Border x:Name="LeftContentBorder" Grid.Row="0" Grid.Column="0" Stroke="White" StrokeThickness="1" Background="#194a6e"> <Border.StrokeShape> <RoundRectangle CornerRadius="5" /> </Border.StrokeShape> <Grid x:Name="LeftContentGrid" RowDefinitions="3.5*,5.5*,2*"> <Border x:Name="LeftContentBorder00" Grid.Row="0" Grid.Column="0" Stroke="#194a6e" StrokeThickness="1" Background="White"> <Border.StrokeShape> <RoundRectangle CornerRadius="5" /> </Border.StrokeShape> <Grid x:Name="ShowInfoGrid" RowDefinitions="1.3*,1.2*,*"> <Grid x:Name="ShowInfoGrid00" Margin="4,0" RowSpacing="0" ColumnSpacing="0" Grid.Row="0" Grid.Column="0" RowDefinitions="0.4*,0.3*,0.3*" ColumnDefinitions="*,*,*,*,*,*" IsEnabled="True"> <Label x:Name="OrderStatusLable" Grid.Row="0" Grid.ColumnSpan="6" Text="訂購中" LineBreakMode="WordWrap" TextColor="Black" FontSize="Large" FontAutoScalingEnabled="True" VerticalTextAlignment="Center" HorizontalTextAlignment="Center" BackgroundColor="Transparent" HorizontalOptions="Fill" VerticalOptions="Fill"/> <Label x:Name="QuantityTextLable" Grid.Row="1" Grid.Column="0" Text="商品數量:" LineBreakMode="WordWrap" TextColor="Black" FontSize="Default" FontAutoScalingEnabled="True" VerticalTextAlignment="Center" HorizontalTextAlignment="Start" BackgroundColor="Transparent" HorizontalOptions="Fill" VerticalOptions="Fill"/> <Label x:Name="QuantityValueLable" Grid.Row="1" Grid.Column="1" Text="100" LineBreakMode="WordWrap" TextColor="Black" FontSize="Default" FontAutoScalingEnabled="True" VerticalTextAlignment="Center" HorizontalTextAlignment="Start" BackgroundColor="Transparent" HorizontalOptions="Fill" VerticalOptions="Fill"/> <Label x:Name="DiscountTextLable" Grid.Row="1" Grid.Column="2" Text="優惠金額:" LineBreakMode="WordWrap" TextColor="Black" FontSize="Default" FontAutoScalingEnabled="True" VerticalTextAlignment="Center" HorizontalTextAlignment="Start" BackgroundColor="Transparent" HorizontalOptions="Fill" VerticalOptions="Fill"/> <Label x:Name="DiscountValueLable" Grid.Row="1" Grid.Column="3" Text="100" LineBreakMode="WordWrap" TextColor="Black" FontSize="Default" FontAutoScalingEnabled="True" VerticalTextAlignment="Center" HorizontalTextAlignment="Start" BackgroundColor="Transparent" HorizontalOptions="Fill" VerticalOptions="Fill"/> <Label x:Name="ServiceTextLable" Grid.Row="1" Grid.Column="4" Text="服務費:" LineBreakMode="WordWrap" TextColor="Black" FontSize="Default" FontAutoScalingEnabled="True" VerticalTextAlignment="Center" HorizontalTextAlignment="Start" BackgroundColor="Transparent" HorizontalOptions="Fill" VerticalOptions="Fill"/> <Label x:Name="ServiceValueLable" Grid.Row="1" Grid.Column="5" Text="100" LineBreakMode="WordWrap" TextColor="Black" FontSize="Default" FontAutoScalingEnabled="True" VerticalTextAlignment="Center" HorizontalTextAlignment="Start" BackgroundColor="Transparent" HorizontalOptions="Fill" VerticalOptions="Fill"/> <Label x:Name="ReceivableTextLable" Grid.Row="2" Grid.Column="0" Text="應收總額:" LineBreakMode="WordWrap" TextColor="Black" FontSize="Default" FontAutoScalingEnabled="True" VerticalTextAlignment="Center" HorizontalTextAlignment="Start" BackgroundColor="Transparent" HorizontalOptions="Fill" VerticalOptions="Fill"/> <Label x:Name="ReceivableValueLable" Grid.Row="2" Grid.Column="1" Text="300" LineBreakMode="WordWrap" TextColor="Black" FontSize="Default" FontAutoScalingEnabled="True" VerticalTextAlignment="Center" HorizontalTextAlignment="Start" BackgroundColor="Transparent" HorizontalOptions="Fill" VerticalOptions="Fill"/> <Label x:Name="ChangeTextLable" Grid.Row="2" Grid.Column="2" Text="找零金額:" LineBreakMode="WordWrap" TextColor="Black" FontSize="Default" FontAutoScalingEnabled="True" VerticalTextAlignment="Center" HorizontalTextAlignment="Start" BackgroundColor="Transparent" HorizontalOptions="Fill" VerticalOptions="Fill"/> <Label x:Name="ChangeValueLable" Grid.Row="2" Grid.Column="3" Text="100" LineBreakMode="WordWrap" TextColor="Black" FontSize="Default" FontAutoScalingEnabled="True" VerticalTextAlignment="Center" HorizontalTextAlignment="Start" BackgroundColor="Transparent" HorizontalOptions="Fill" VerticalOptions="Fill"/> </Grid> <Grid x:Name="ShowInfoGrid01" Margin="4,0" RowSpacing="0" ColumnSpacing="0" Grid.Row="1" Grid.Column="0" RowDefinitions="2,*,*,*" ColumnDefinitions="1.09*,1.99*,1.09*,1.5*,0.9*,0.6*"> <Border x:Name="ShowInfoLine00" Grid.Row="0" Grid.ColumnSpan="6" Stroke="Black" StrokeThickness="0.5"/> <Label x:Name="OrderNoTextLable" Grid.Row="1" Grid.Column="0" Text="訂單編號:" LineBreakMode="WordWrap" TextColor="Black" FontSize="Default" FontAutoScalingEnabled="True" VerticalTextAlignment="Center" HorizontalTextAlignment="Start" BackgroundColor="Transparent" HorizontalOptions="Fill" VerticalOptions="Fill"/> <Label x:Name="OrderNoValueLable" Grid.Row="1" Grid.Column="1" Text="20230927-0001" LineBreakMode="WordWrap" TextColor="Black" FontSize="Default" FontAutoScalingEnabled="True" VerticalTextAlignment="Center" HorizontalTextAlignment="Center" BackgroundColor="Transparent" HorizontalOptions="Fill" VerticalOptions="Fill"/> <Label x:Name="PickupNoTextLable" Grid.Row="1" Grid.Column="2" Text="取餐號:" LineBreakMode="WordWrap" TextColor="Black" FontSize="Default" FontAutoScalingEnabled="True" VerticalTextAlignment="Center" HorizontalTextAlignment="Start" BackgroundColor="Transparent" HorizontalOptions="Fill" VerticalOptions="Fill"/> <Label x:Name="PickupNoValueLable" Grid.Row="1" Grid.Column="3" Text="00000001" LineBreakMode="WordWrap" TextColor="Black" FontSize="Default" FontAutoScalingEnabled="True" VerticalTextAlignment="Center" HorizontalTextAlignment="Start" BackgroundColor="Transparent" HorizontalOptions="Fill" VerticalOptions="Fill"/> <Label x:Name="VisitorsTextLable" Grid.Row="1" Grid.Column="4" Text="來客數:" LineBreakMode="WordWrap" TextColor="Black" FontSize="Default" FontAutoScalingEnabled="True" VerticalTextAlignment="Center" HorizontalTextAlignment="Start" BackgroundColor="Transparent" HorizontalOptions="Fill" VerticalOptions="Fill"/> <Label x:Name="VisitorsValueLable" Grid.Row="1" Grid.Column="5" Text="0001" LineBreakMode="WordWrap" TextColor="Black" FontSize="Default" FontAutoScalingEnabled="True" VerticalTextAlignment="Center" HorizontalTextAlignment="Center" BackgroundColor="Transparent" HorizontalOptions="Fill" VerticalOptions="Fill"/> <Label x:Name="OrderTypeTextLable" Grid.Row="2" Grid.Column="0" Text="訂單類型:" LineBreakMode="WordWrap" TextColor="Black" FontSize="Default" FontAutoScalingEnabled="True" VerticalTextAlignment="Center" HorizontalTextAlignment="Start" BackgroundColor="Transparent" HorizontalOptions="Fill" VerticalOptions="Fill"/> <Label x:Name="OrderTypeValueLable" Grid.Row="2" Grid.Column="1" Text="Uber Eats" LineBreakMode="WordWrap" TextColor="Black" FontSize="Default" FontAutoScalingEnabled="True" VerticalTextAlignment="Center" HorizontalTextAlignment="Center" BackgroundColor="Transparent" HorizontalOptions="Fill" VerticalOptions="Fill"/> <Label x:Name="TableNoTextLable" Grid.Row="2" Grid.Column="2" Text="桌號:" LineBreakMode="WordWrap" TextColor="Black" FontSize="Default" FontAutoScalingEnabled="True" VerticalTextAlignment="Center" HorizontalTextAlignment="Start" BackgroundColor="Transparent" HorizontalOptions="Fill" VerticalOptions="Fill"/> <Label x:Name="TableNoValueLable" Grid.Row="2" Grid.Column="3" Text="豪華廳A0001" LineBreakMode="WordWrap" TextColor="Black" FontSize="Default" FontAutoScalingEnabled="True" VerticalTextAlignment="Center" HorizontalTextAlignment="Start" BackgroundColor="Transparent" HorizontalOptions="Fill" VerticalOptions="Fill"/> <Label x:Name="ShopNoTextLable" Grid.Row="2" Grid.Column="4" Text="牌號:" LineBreakMode="WordWrap" TextColor="Black" FontSize="Default" FontAutoScalingEnabled="True" VerticalTextAlignment="Center" HorizontalTextAlignment="Start" BackgroundColor="Transparent" HorizontalOptions="Fill" VerticalOptions="Fill"/> <Label x:Name="ShopNoValueLable" Grid.Row="2" Grid.Column="5" Text="100" LineBreakMode="WordWrap" TextColor="Black" FontSize="Default" FontAutoScalingEnabled="True" VerticalTextAlignment="Center" HorizontalTextAlignment="Center" BackgroundColor="Transparent" HorizontalOptions="Fill" VerticalOptions="Fill"/> <Label x:Name="MemberNameTextLable" Grid.Row="3" Grid.Column="0" Text="會員名稱:" LineBreakMode="WordWrap" TextColor="Black" FontSize="Default" FontAutoScalingEnabled="True" VerticalTextAlignment="Center" HorizontalTextAlignment="Start" BackgroundColor="Transparent" HorizontalOptions="Fill" VerticalOptions="Fill"/> <Label x:Name="MemberNameValueLable" Grid.Row="3" Grid.Column="1" Text="合用系統有限公司" LineBreakMode="WordWrap" TextColor="Black" FontSize="Default" FontAutoScalingEnabled="True" VerticalTextAlignment="Center" HorizontalTextAlignment="Center" BackgroundColor="Transparent" HorizontalOptions="Fill" VerticalOptions="Fill"/> <Label x:Name="MemberTelTextLable" Grid.Row="3" Grid.Column="2" Text="會員電話:" LineBreakMode="WordWrap" TextColor="Black" FontSize="Default" FontAutoScalingEnabled="True" VerticalTextAlignment="Center" HorizontalTextAlignment="Start" BackgroundColor="Transparent" HorizontalOptions="Fill" VerticalOptions="Fill"/> <Label x:Name="MemberTelValueLable" Grid.Row="3" Grid.Column="3" Text="04-22216292" LineBreakMode="WordWrap" TextColor="Black" FontSize="Default" FontAutoScalingEnabled="True" VerticalTextAlignment="Center" HorizontalTextAlignment="Center" BackgroundColor="Transparent" HorizontalOptions="Fill" VerticalOptions="Fill"/> </Grid> <Grid x:Name="ShowInfoGrid02" Margin="4,0" RowSpacing="1" ColumnSpacing="0" Grid.Row="2" Grid.Column="0" RowDefinitions="2,*,*" ColumnDefinitions="1*,1.3*,0.6*,1.31*,1.19*,0.6*"> <Border x:Name="ShowInfoLine01" Grid.Row="0" Grid.ColumnSpan="6" Stroke="Black" StrokeThickness="0.5"/> <Label x:Name="InvoiceNoTextLable" Grid.Row="1" Grid.Column="0" Text="發票號碼:" LineBreakMode="WordWrap" TextColor="Black" FontSize="Default" FontAutoScalingEnabled="True" VerticalTextAlignment="Center" HorizontalTextAlignment="Start" BackgroundColor="Transparent" HorizontalOptions="Fill" VerticalOptions="Fill"/> <Label x:Name="InvoiceNoValueLable" Grid.Row="1" Grid.Column="1" Text="AB14433816" LineBreakMode="WordWrap" TextColor="Black" FontSize="Default" FontAutoScalingEnabled="True" VerticalTextAlignment="Center" HorizontalTextAlignment="Start" BackgroundColor="Transparent" HorizontalOptions="Fill" VerticalOptions="Fill"/> <local:CustBtn x:Name="InvoiceNoBtn" Grid.Row="1" Grid.Column="2" Grid.RowSpan="2" HorizontalOptions="Fill" VerticalOptions="Fill"/> <Label x:Name="InvoiceCountTextLable" Grid.Row="1" Grid.Column="3" Text="發票剩餘張數:" LineBreakMode="WordWrap" TextColor="Black" FontSize="Default" FontAutoScalingEnabled="True" VerticalTextAlignment="Center" HorizontalTextAlignment="Start" BackgroundColor="Transparent" HorizontalOptions="Fill" VerticalOptions="Fill"/> <Label x:Name="InvoiceCountValueLable" Grid.Row="1" Grid.Column="4" Text="100" LineBreakMode="WordWrap" TextColor="Black" FontSize="Default" FontAutoScalingEnabled="True" VerticalTextAlignment="Center" HorizontalTextAlignment="Center" BackgroundColor="Transparent" HorizontalOptions="Fill" VerticalOptions="Fill"/> <local:CustBtn x:Name="CarrierBtn" Grid.Row="1" Grid.Column="5" Grid.RowSpan="2" HorizontalOptions="Fill" VerticalOptions="Fill"/> <Label x:Name="TaxIDTextLable" Grid.Row="2" Grid.Column="0" Text="客戶統編:" LineBreakMode="WordWrap" TextColor="Black" FontSize="Default" FontAutoScalingEnabled="True" VerticalTextAlignment="Center" HorizontalTextAlignment="Start" BackgroundColor="Transparent" HorizontalOptions="Fill" VerticalOptions="Fill"/> <Label x:Name="TaxIDValueLable" Grid.Row="2" Grid.Column="1" Text="42897648" LineBreakMode="WordWrap" TextColor="Black" FontSize="Default" FontAutoScalingEnabled="True" VerticalTextAlignment="Center" HorizontalTextAlignment="Start" BackgroundColor="Transparent" HorizontalOptions="Fill" VerticalOptions="Fill"/> <Label x:Name="CarrierTextLable" Grid.Row="2" Grid.Column="3" Text="發票載具:" LineBreakMode="WordWrap" TextColor="Black" FontSize="Default" FontAutoScalingEnabled="True" VerticalTextAlignment="Center" HorizontalTextAlignment="Start" BackgroundColor="Transparent" HorizontalOptions="Fill" VerticalOptions="Fill"/> <Label x:Name="CarrierValueLable" Grid.Row="2" Grid.Column="4" Text="/RZDFEP2" LineBreakMode="WordWrap" TextColor="Black" FontSize="Default" FontAutoScalingEnabled="True" VerticalTextAlignment="Center" HorizontalTextAlignment="Start" BackgroundColor="Transparent" HorizontalOptions="Fill" VerticalOptions="Fill"/> </Grid> </Grid><!--ShowInforGrid--> </Border><!--LeftContentBorder00--> <Border x:Name="LeftContentBorder01" Grid.Row="1" Grid.Column="0" Stroke="#194a6e" StrokeThickness="1" Background="White"> <Border.StrokeShape> <RoundRectangle CornerRadius="5" /> </Border.StrokeShape> <Grid x:Name="ShopcartGrid" RowSpacing="2" ColumnSpacing="2" ColumnDefinitions="5.2*,0.8*"> <Grid x:Name="ShopcartMainGrid" Grid.Row="0" Grid.Column="0" RowDefinitions="*" ColumnDefinitions="*"> <ListView x:Name="ShopcartListView" Grid.Row="0" Grid.Column="0" SelectionMode="Single" BackgroundColor="White" RowHeight="46"> <ListView.ItemTemplate> <DataTemplate> <ViewCell> <!-- ListView 資料結構標準: ListView.ItemTemplate -> DataTemplate -> ViewCell--> <Grid ColumnDefinitions="30,30,4*,1*,1*,1.2*"> <Image Source="{Binding Image00}" WidthRequest="30" HeightRequest="30" Grid.Column="0"/> <Image Source="{Binding Image01}" WidthRequest="30" HeightRequest="30" Grid.Column="1"/> <Label Text="{Binding Name}" FontSize="Subtitle" FontAutoScalingEnabled="True" VerticalTextAlignment="Center" TextColor="{Binding Font_Color}" Grid.Column="2"/> <Label Text="{Binding Amount}" FontSize="Subtitle" FontAutoScalingEnabled="True" VerticalTextAlignment="Center" TextColor="{Binding Font_Color}" Grid.Column="3"/> <Label Text="{Binding Price}" FontSize="Subtitle" FontAutoScalingEnabled="True" VerticalTextAlignment="Center" TextColor="{Binding Font_Color}" Grid.Column="4"/> <Label Text="{Binding Sum}" FontSize="Subtitle" FontAutoScalingEnabled="True" VerticalTextAlignment="Center" TextColor="{Binding Font_Color}" Grid.Column="5"/> </Grid> </ViewCell> </DataTemplate> </ListView.ItemTemplate> </ListView> </Grid> <Border x:Name="ShopcartBtnBorder" Grid.Row="0" Grid.Column="1" Stroke="White" StrokeThickness="1" Background="#194a6e"> <Border.StrokeShape> <RoundRectangle CornerRadius="5" /> </Border.StrokeShape> <VerticalStackLayout x:Name="ShopcartBtnVertical" Padding="3" Spacing="10"> <local:CustBtn x:Name="ModifiedBtn" HorizontalOptions="Fill" VerticalOptions="Center"> </local:CustBtn> <local:CustBtn x:Name="PlusBtn" HorizontalOptions="Fill" VerticalOptions="Center"> </local:CustBtn> <local:CustBtn x:Name="MinusBtn" HorizontalOptions="Fill" VerticalOptions="Center"> </local:CustBtn> </VerticalStackLayout> </Border> </Grid><!--ShopcartGrid--> </Border><!--LeftContentBorder01--> <Border x:Name="LeftContentBorder02" Grid.Row="2" Grid.Column="0" Stroke="#194a6e" StrokeThickness="1" Background="White"> <Border.StrokeShape> <RoundRectangle CornerRadius="5" /> </Border.StrokeShape> <Grid x:Name="ShopcartBtnGrid" Margin="1,2" RowSpacing="1" ColumnSpacing="1" RowDefinitions="*,*" ColumnDefinitions="*,*,*,*,*"> <local:CustBtn x:Name="ShopcartBtn00" Grid.Row="0" Grid.Column="0" HorizontalOptions="Fill" VerticalOptions="Fill"/> <local:CustBtn x:Name="ShopcartBtn01" Grid.Row="0" Grid.Column="1" HorizontalOptions="Fill" VerticalOptions="Fill"/> <local:CustBtn x:Name="ShopcartBtn02" Grid.Row="0" Grid.Column="2" HorizontalOptions="Fill" VerticalOptions="Fill"/> <local:CustBtn x:Name="ShopcartBtn03" Grid.Row="0" Grid.Column="3" HorizontalOptions="Fill" VerticalOptions="Fill"/> <local:CustBtn x:Name="ShopcartBtn04" Grid.Row="0" Grid.Column="4" Grid.RowSpan="2" HorizontalOptions="Fill" VerticalOptions="Fill"/> <local:CustBtn x:Name="ShopcartBtn05" Grid.Row="1" Grid.Column="0" HorizontalOptions="Fill" VerticalOptions="Fill"/> <local:CustBtn x:Name="ShopcartBtn06" Grid.Row="1" Grid.Column="1" HorizontalOptions="Fill" VerticalOptions="Fill"/> <local:CustBtn x:Name="ShopcartBtn07" Grid.Row="1" Grid.Column="2" HorizontalOptions="Fill" VerticalOptions="Fill"/> <local:CustBtn x:Name="ShopcartBtn08" Grid.Row="1" Grid.Column="3" HorizontalOptions="Fill" VerticalOptions="Fill"/> </Grid> </Border><!--LeftContentBorder02--> </Grid><!--LeftContentGrid--> </Border><!--LeftContentBorder--> <Border x:Name="MiddleContentBorder" Grid.Row="0" Grid.Column="1" Stroke="White" StrokeThickness="1" Background="#194a6e"> <Border.StrokeShape> <RoundRectangle CornerRadius="5" /> </Border.StrokeShape> </Border><!--MiddleContentBorder--> <Border x:Name="RightContentBorder" Grid.Row="0" Grid.Column="2" Stroke="White" StrokeThickness="1" Background="#194a6e"> <Border.StrokeShape> <RoundRectangle CornerRadius="5" /> </Border.StrokeShape> <Grid x:Name="RightContentGrid" RowSpacing="2" ColumnSpacing="2" RowDefinitions="2*,7*,2*"> <Border x:Name="RightContentBorder00" Grid.Row="0" Grid.Column="0" Stroke="#194a6e" StrokeThickness="1" Background="White"> <Border.StrokeShape> <RoundRectangle CornerRadius="5" /> </Border.StrokeShape> <Grid x:Name="CategoryBtnGrid" ColumnDefinitions="5*,0.5*"> <Border x:Name="CategoryBtnBorder01" Grid.Row="0" Grid.Column="1" Stroke="White" StrokeThickness="1" Background="#194a6e"> <Border.StrokeShape> <RoundRectangle CornerRadius="5" /> </Border.StrokeShape> <Grid RowDefinitions="*,0.85*,*" Margin="0,3,0,3"> <local:CustBtn x:Name="CategoryUpBtn" Grid.Row="0" Grid.Column="0" HorizontalOptions="Center" VerticalOptions="Start"> </local:CustBtn> <Label x:Name="CategoryTextLable" Grid.Row="1" Grid.Column="0" Text="1/2" LineBreakMode="WordWrap" TextColor="White" FontSize="Default" FontAutoScalingEnabled="True" VerticalTextAlignment="Center" HorizontalTextAlignment="Center" BackgroundColor="Transparent" HorizontalOptions="Fill" VerticalOptions="Fill"/> <local:CustBtn x:Name="CategoryDownBtn" Grid.Row="2" Grid.Column="0" HorizontalOptions="Center" VerticalOptions="End"> </local:CustBtn> </Grid> </Border> </Grid> </Border><!--RightContentBorder00--> <Border x:Name="RightContentBorder01" Grid.Row="1" Grid.Column="0" Stroke="#194a6e" StrokeThickness="1" Background="White"> <Border.StrokeShape> <RoundRectangle CornerRadius="5" /> </Border.StrokeShape> <Grid x:Name="ProductBtnGrid" ColumnDefinitions="5*,0.5*"> <Border x:Name="ProductBtnBorder01" Grid.Row="0" Grid.Column="1" Stroke="White" StrokeThickness="1" Background="#194a6e"> <Border.StrokeShape> <RoundRectangle CornerRadius="5" /> </Border.StrokeShape> <Grid RowDefinitions="*,0.3*,*"> <local:CustBtn x:Name="ProductUpBtn" Grid.Row="0" Grid.Column="0" HorizontalOptions="Center" VerticalOptions="End"> </local:CustBtn> <Label x:Name="ProductTextLable" Grid.Row="1" Grid.Column="0" Text="1/2" LineBreakMode="WordWrap" TextColor="White" FontSize="Default" FontAutoScalingEnabled="True" VerticalTextAlignment="Center" HorizontalTextAlignment="Center" BackgroundColor="Transparent" HorizontalOptions="Fill" VerticalOptions="Fill"/> <local:CustBtn x:Name="ProductDownBtn" Grid.Row="2" Grid.Column="0" HorizontalOptions="Center" VerticalOptions="Start"> </local:CustBtn> </Grid> </Border> </Grid> </Border><!--RightContentBorder01--> <Border x:Name="RightContentBorder02" Grid.Row="2" Grid.Column="0" Stroke="#194a6e" StrokeThickness="1" Background="White"> <Border.StrokeShape> <RoundRectangle CornerRadius="5" /> </Border.StrokeShape> <Grid x:Name="CondimentBtnGrid" ColumnDefinitions="5*,0.5*"> <Border x:Name="CondimentBtnBorder01" Grid.Row="0" Grid.Column="1" Stroke="White" StrokeThickness="1" Background="#194a6e"> <Border.StrokeShape> <RoundRectangle CornerRadius="5" /> </Border.StrokeShape> <Grid RowDefinitions="*,0.85*,*" Margin="0,3,0,3"> <local:CustBtn x:Name="CondimentUpBtn" Grid.Row="0" Grid.Column="0" HorizontalOptions="Center" VerticalOptions="Start"> </local:CustBtn> <Label x:Name="CondimentTextLable" Grid.Row="1" Grid.Column="0" Text="1/2" LineBreakMode="WordWrap" TextColor="White" FontSize="Default" FontAutoScalingEnabled="True" VerticalTextAlignment="Center" HorizontalTextAlignment="Center" BackgroundColor="Transparent" HorizontalOptions="Fill" VerticalOptions="Fill"/> <local:CustBtn x:Name="CondimentDownBtn" Grid.Row="2" Grid.Column="0" HorizontalOptions="Center" VerticalOptions="End"> </local:CustBtn> </Grid> </Border> </Grid> </Border><!--RightContentBorder02--> </Grid><!--RightContentGrid--> </Border><!--RightContentBorder--> </Grid><!--ContentGrid--> </Grid><!--WorkspaceGrid--> <Grid x:Name="StatusGrid" Grid.Row="1" Grid.Column="0"> <Border x:Name="StatusBorder" Stroke="White" StrokeThickness="1" Background="#194a6e"> <Border.StrokeShape> <RoundRectangle CornerRadius="5" /> </Border.StrokeShape> </Border><!--StatusBorder--> </Grid><!--StatusGrid--> </Grid><!--FullGrid--> </ContentPage>
Code
public class ShopcartItem { public string id { get; set; } public string Image00 { get; set; } public string Image01 { get; set; } public string Name { get; set; } public string Amount { get; set; } public string Price { get; set; } public string Sum { get; set; } public string image_id { get; set; } public Color Font_Color { get; set; } public string State { get; set; } }
public partial class MainPage : ContentPage { private ObservableCollection<ShopcartItem> m_ShopcartItems = new ObservableCollection<ShopcartItem>(); public MainPage()//建構子 { InitializeComponent(); LogFile.Write("MainPage Start"); GetDisplayInfo(); ShowInfoInit(); ShopcartBtnGridInit(); CreateCategoryBtn(8,2,4); CreateProductBtn(16,4,4); CreateCondimentBtn(8,2,4); ShopcartListView.ItemsSource = m_ShopcartItems;//綁定購物車資料結構 /* //--- //移除方格整列元素 & 動態調整版面大小 ShowInfoLine01.IsVisible = false; InvoiceNoTextLable.IsVisible = false; InvoiceNoValueLable.IsVisible = false; InvoiceNoBtn.IsVisible = false; InvoiceCountTextLable.IsVisible = false; InvoiceCountValueLable.IsVisible = false; CarrierBtn.IsVisible = false; TaxIDTextLable.IsVisible = false; TaxIDValueLable.IsVisible = false; CarrierTextLable.IsVisible = false; CarrierValueLable.IsVisible = false; ShowInfoGrid.RowDefinitions.RemoveAt(2); LeftContentGrid.RowDefinitions[0] = new RowDefinition(new GridLength(2.5, GridUnitType.Star)); LeftContentGrid.RowDefinitions[1] = new RowDefinition(new GridLength(6.5, GridUnitType.Star)); //---移除方格整列元素 & 動態調整版面大小 */ } private void ShowInfoInit() { /* OrderStatusLable.Text = "";//訂購中 QuantityValueLable.Text = "";//商品數量 DiscountValueLable.Text = "";//優惠金額 ServiceValueLable.Text = "";//服務費 ReceivableValueLable.Text = "";//應收總額 ChangeValueLable.Text = "";//找零金額 OrderNoValueLable.Text = "";//訂單編號 PickupNoValueLable.Text = "";//取餐號 VisitorsValueLable.Text = "";//來客數 OrderTypeValueLable.Text = "";//訂單類型 TableNoValueLable.Text = "";//桌號 ShopNoValueLable.Text = "";//牌號 MemberNameValueLable.Text = "";//會員名稱 MemberTelValueLable.Text = "";//會員電話 InvoiceNoValueLable.Text = "";//發票號碼 InvoiceCountValueLable.Text = "";//發票剩餘張數 TaxIDValueLable.Text = "";//客戶統編 CarrierValueLable.Text = "";//發票載具 //*/ Color BackgroundColor = new Color(25, 74, 110); double dblFontSize = Device.GetNamedSize(NamedSize.Default, typeof(Label)); CarrierBtn.InitDisplay(Colors.White, BackgroundColor, "發票\n載具", dblFontSize); InvoiceNoBtn.InitDisplay(Colors.White, BackgroundColor, "客戶\n統編", dblFontSize); } private void ShopcartBtnGridInit() { double dblFontSize = Device.GetNamedSize(NamedSize.Default, typeof(Label)); ShopcartBtn00.m_intSID = 0; ShopcartBtn01.m_intSID = 1; ShopcartBtn02.m_intSID = 2; ShopcartBtn03.m_intSID = 3; ShopcartBtn04.m_intSID = 4; ShopcartBtn05.m_intSID = 5; ShopcartBtn06.m_intSID = 6; ShopcartBtn07.m_intSID = 7; ShopcartBtn08.m_intSID = 8; //ShopcartBtn09.m_intSID = 9; //ShopcartBtn10.m_intSID= 10; Color BackgroundColor = new Color(25, 74, 110); String []StrName= new String[11]; for(int i=0; i<11; i++) { StrName[i]= i.ToString(); } ShopcartBtn00.InitDisplay(Colors.White, BackgroundColor, StrName[0], dblFontSize); ShopcartBtn01.InitDisplay(Colors.White, BackgroundColor, StrName[1], dblFontSize); ShopcartBtn02.InitDisplay(Colors.White, BackgroundColor, StrName[2], dblFontSize); ShopcartBtn03.InitDisplay(Colors.White, BackgroundColor, StrName[3], dblFontSize); ShopcartBtn04.InitDisplay(Colors.White, BackgroundColor, StrName[4], dblFontSize); ShopcartBtn05.InitDisplay(Colors.White, BackgroundColor, StrName[5], dblFontSize); ShopcartBtn06.InitDisplay(Colors.White, BackgroundColor, StrName[6], dblFontSize); ShopcartBtn07.InitDisplay(Colors.White, BackgroundColor, StrName[7], dblFontSize); ShopcartBtn08.InitDisplay(Colors.White, BackgroundColor, StrName[8], dblFontSize); //ShopcartBtn09.InitDisplay(Colors.White, BackgroundColor, StrName[9], dblFontSize); //ShopcartBtn10.InitDisplay(Colors.White, BackgroundColor, StrName[10], dblFontSize); // 綁定事件 var tapGestureRecognizer = new TapGestureRecognizer(); tapGestureRecognizer.Tapped += ShopcartBtn_Clicked; ShopcartBtn00.GestureRecognizers.Add(tapGestureRecognizer); ShopcartBtn01.GestureRecognizers.Add(tapGestureRecognizer); ShopcartBtn02.GestureRecognizers.Add(tapGestureRecognizer); ShopcartBtn03.GestureRecognizers.Add(tapGestureRecognizer); ShopcartBtn04.GestureRecognizers.Add(tapGestureRecognizer); ShopcartBtn05.GestureRecognizers.Add(tapGestureRecognizer); ShopcartBtn06.GestureRecognizers.Add(tapGestureRecognizer); ShopcartBtn07.GestureRecognizers.Add(tapGestureRecognizer); ShopcartBtn08.GestureRecognizers.Add(tapGestureRecognizer); //ShopcartBtn09.GestureRecognizers.Add(tapGestureRecognizer); //ShopcartBtn10.GestureRecognizers.Add(tapGestureRecognizer); ModifiedBtn.InitDisplay(Colors.White, BackgroundColor, "修改", dblFontSize); PlusBtn.InitDisplay(Colors.White, BackgroundColor, "┼", dblFontSize); MinusBtn.InitDisplay(Colors.White, BackgroundColor, "─", dblFontSize); } private async void ShopcartBtn_Clicked(object sender, EventArgs e) { await this.ShowPopupAsync(new MessageBox($"{((CustBtn)(sender)).m_intSID}")); switch(((CustBtn)(sender)).m_intSID) { case 0: break; case 1: break; case 2: break; case 3: break; case 4://結帳按鈕 break; case 5: break; case 6: break; case 7: break; case 8: break; case 9: break; case 10: break; } } //--- //畫面右側按鈕動態建立函數 CustBtn[] m_CategoryBtn; private void CreateCategoryBtn(int intQuantity, int intRows, int intColumns) { double dblFontSize = Device.GetNamedSize(NamedSize.Default, typeof(Label)); CategoryUpBtn.InitDisplay(Colors.White, new Color(25, 74, 110), "▲", dblFontSize); CategoryDownBtn.InitDisplay(Colors.White, new Color(25, 74, 110), "▼", dblFontSize); if (intRows*intColumns>= intQuantity) { Grid CategoryMainGrid = new Grid();//建立網格 CategoryMainGrid.Margin = new Thickness(2,1,2,1); CategoryMainGrid.RowSpacing = 1; CategoryMainGrid.ColumnSpacing = 1; for (int i = 0;i<intRows;i++) //配置列數 { CategoryMainGrid.RowDefinitions.Add(new RowDefinition()); } for (int i = 0; i < intColumns; i++)//配置行數 { CategoryMainGrid.ColumnDefinitions.Add(new ColumnDefinition()); } m_CategoryBtn=new CustBtn[intQuantity];//建立按鈕陣列 for(int i=0;i<intQuantity;i++) { //建立按鈕 m_CategoryBtn[i] = new CustBtn();//建立每個按鈕實體 m_CategoryBtn[i].InitData(i); dblFontSize = Device.GetNamedSize(NamedSize.Default, typeof(Label)); m_CategoryBtn[i].InitDisplay(new Color(65, 134, 168), new Color(36,112,160),$"產品類名稱超長測試{i+1}", dblFontSize);//每個按鈕初始化 // 綁定事件 var tapGestureRecognizer = new TapGestureRecognizer(); tapGestureRecognizer.Tapped += CategoryBtn_Clicked; m_CategoryBtn[i].GestureRecognizers.Add(tapGestureRecognizer); //放到Layout上 int intRow = i / intColumns; int intColumn = i % intColumns; CategoryMainGrid.Add(m_CategoryBtn[i], intColumn, intRow); } //放到XAML的Layout上 CategoryBtnGrid.Add(CategoryMainGrid, 0, 0); } } private async void CategoryBtn_Clicked(object sender, EventArgs e) { await this.ShowPopupAsync(new MessageBox($"{((CustBtn)(sender)).m_intSID}")); //--- //手動增加ListView項目[測試程式] ShopcartItem ShopcartItemMain = new ShopcartItem(); ShopcartItemMain.id = "0"; ShopcartItemMain.Image00 = "checkbox00.png"; ShopcartItemMain.Image01 = "blank.png"; ShopcartItemMain.Name = "四季春"; ShopcartItemMain.Amount = "10"; ShopcartItemMain.Price = "40"; ShopcartItemMain.Sum = "400"; ShopcartItemMain.Font_Color = Colors.Black; m_ShopcartItems.Add(ShopcartItemMain); ShopcartListView.ScrollTo(m_ShopcartItems[m_ShopcartItems.Count-1], ScrollToPosition.End, false); //---手動增加ListView項目[測試程式] } CustBtn[] m_ProductBtn; private void CreateProductBtn(int intQuantity, int intRows, int intColumns) { double dblFontSize = Device.GetNamedSize(NamedSize.Default, typeof(Label)); ProductUpBtn.InitDisplay(Colors.White, new Color(25, 74, 110), "▲", dblFontSize); ProductDownBtn.InitDisplay(Colors.White, new Color(25, 74, 110), "▼", dblFontSize); if (intRows * intColumns >= intQuantity) { Grid ProductMainGrid = new Grid(); ProductMainGrid.Margin = new Thickness(2, 2, 1, 1); ProductMainGrid.RowSpacing = 1; ProductMainGrid.ColumnSpacing = 1; for (int i = 0; i < intRows; i++) { ProductMainGrid.RowDefinitions.Add(new RowDefinition()); } for (int i = 0; i < intColumns; i++) { ProductMainGrid.ColumnDefinitions.Add(new ColumnDefinition()); } m_ProductBtn = new CustBtn[intQuantity];//建立按鈕陣列 for (int i = 0; i < intQuantity; i++) { //建立按鈕 m_ProductBtn[i] = new CustBtn();//建立每個按鈕實體 m_ProductBtn[i].InitData(i); dblFontSize = Device.GetNamedSize(NamedSize.Default, typeof(Label)); m_ProductBtn[i].InitDisplay(Colors.White, new Color(106, 117, 79), $"產品名稱{i + 1}", dblFontSize);//每個按鈕初始化 // 綁定事件 var tapGestureRecognizer = new TapGestureRecognizer(); tapGestureRecognizer.Tapped += Product_Clicked; m_ProductBtn[i].GestureRecognizers.Add(tapGestureRecognizer); //放到Layout上 int intRow = i / intColumns; int intColumn = i % intColumns; ProductMainGrid.Add(m_ProductBtn[i], intColumn, intRow); } //放到XAML的Layout上 ProductBtnGrid.Add(ProductMainGrid, 0, 0); } } private async void Product_Clicked(object sender, EventArgs e) { await this.ShowPopupAsync(new MessageBox($"{((CustBtn)(sender)).m_intSID}")); //--- //手動修改ListView中的項目[測試程式] //m_ShopcartItems.RemoveAt(0);//刪除 //m_ShopcartItems.Clear();//清空 //m_ShopcartItems.Insert(index, item);//插入 ShopcartItem Item = m_ShopcartItems[2]; Item.Font_Color = Colors.Red; Item.Image00 = "checkbox01.png"; m_ShopcartItems[2] = Item; //---手動修改ListView中的項目[測試程式] } CustBtn[] m_CondimentBtn; private void CreateCondimentBtn(int intQuantity, int intRows, int intColumns) { double dblFontSize = Device.GetNamedSize(NamedSize.Default, typeof(Label)); CondimentUpBtn.InitDisplay(Colors.White, new Color(25, 74, 110), "▲", dblFontSize); CondimentDownBtn.InitDisplay(Colors.White, new Color(25, 74, 110), "▼", dblFontSize); if (intRows * intColumns >= intQuantity) { Grid CondimentMainGrid = new Grid(); CondimentMainGrid.Margin = new Thickness(2, 2, 1, 1); CondimentMainGrid.RowSpacing = 0; CondimentMainGrid.ColumnSpacing = 1; for (int i = 0; i < intRows; i++) { CondimentMainGrid.RowDefinitions.Add(new RowDefinition()); } for (int i = 0; i < intColumns; i++) { CondimentMainGrid.ColumnDefinitions.Add(new ColumnDefinition()); } m_CondimentBtn = new CustBtn[intQuantity];//建立按鈕陣列 for (int i = 0; i < intQuantity; i++) { //建立按鈕 m_CondimentBtn[i] = new CustBtn();//建立每個按鈕實體 m_CondimentBtn[i].InitData(i); dblFontSize = Device.GetNamedSize(NamedSize.Default, typeof(Label)); m_CondimentBtn[i].InitDisplay(Colors.White, new Color(92, 171, 125), $"配料名稱{i + 1}", dblFontSize);//每個按鈕初始化 // 綁定事件 var tapGestureRecognizer = new TapGestureRecognizer(); tapGestureRecognizer.Tapped += Condiment_Clicked; m_CondimentBtn[i].GestureRecognizers.Add(tapGestureRecognizer); //放到Layout上 int intRow = i / intColumns; int intColumn = i % intColumns; CondimentMainGrid.Add(m_CondimentBtn[i], intColumn, intRow); } //放到XAML的Layout上 CondimentBtnGrid.Add(CondimentMainGrid, 0, 0); } } private async void Condiment_Clicked(object sender, EventArgs e) { await this.ShowPopupAsync(new MessageBox($"{((CustBtn)(sender)).m_intSID}")); } //---畫面右側按鈕動態建立函數 //--- //系統菜單事件 private async void LogoutBtn_Clicked(object sender, EventArgs e)//登出 { LogFile.Write("MainPage End"); await Shell.Current.GoToAsync("login"); } private async void DevicesBtn_Clicked(object sender, EventArgs e)//周邊管理 { await Navigation.PushModalAsync(new DevicesListPage()); } private void SettingsBtn_Clicked(object sender, EventArgs e)//系統設定 { } private async void SynchronizeBtn_Clicked(object sender, EventArgs e)//資料更新 { await this.ShowPopupAsync(new QuesMessageBox("確定要執行資料更新?")); if (QuesMessageBox.m_blnResult) { if (HttpsFun.WebRequestTest(ref LoadingPage.m_intNetworkLevel))//判斷是否有網路 { await this.ShowPopupAsync(new SyncLocalDatabase());//同步本地端資料庫 LogFile.Write("MainPage End"); await Shell.Current.GoToAsync("login");//切換到登入頁面 } else { await this.ShowPopupAsync(new MessageBox("網路偵測異常,無法執行資料同步?")); } } } //---系統菜單事件 }