Xamarin 使用网格在另一个视图上使用一个视图

Xamarin use one view on another view using grid

我正在尝试结合两个视图来创建信用卡支付系统。我关注这个博客 Credit Card Payment 和 运行 出错了。

我的支付页面(所有的都在这里)代码:

<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"
         xmlns:models="clr-namespace:MowSnow.Models"
         xmlns:fastEntry="clr-namespace:XamarinFastEntrySample.FastEntry;assembly=XamarinFastEntry.Behaviors"
         xmlns:local="clr-namespace:MowSnow.Views"
         mc:Ignorable="d"
         x:Class="MowSnow.Views.Payment">
<ContentPage.Resources>
    <ResourceDictionary>
        <models:CardNumberToImageConverter x:Key="CardConverter"
                                                Amex="ic_amex"
                                                Dinners="ic_dinersclub"
                                                Discover="ic_discover" 
                                                JCB="ic_jcb"
                                                MasterCard="ic_mastercard" 
                                                Visa="ic_visa"
                                                NotRecognized="nocards"/>

        <models:CardNumberToImageConverter x:Key="CardLightConverter"
                                                Amex="americanexpresslogo"
                                                Dinners="ic_dinersclub_white.png"
                                                Discover="ic_discover_light" 
                                                JCB="ic_jcb"
                                                MasterCard="ic_mastercard_white" 
                                                Visa="ic_visa_white"
                                                NotRecognized="ic_chip"/>

        <models:CardNumberToColorConverter x:Key="CardColorConverter"
                                                Amex="#3177CB"
                                                Dinners="#1B4F8F"
                                                Discover="#E9752F" 
                                                JCB="#9E2921"
                                                MasterCard="#394854" 
                                                Visa="#2867BA"
                                                NotRecognized="#75849D"/>

        <Color x:Key="Primary">#E5E9EE</Color>
        <Color x:Key="PrimaryDark">#75849D</Color>
        <Color x:Key="Secondary">#B5BBC2</Color>
        <Color x:Key="Accent">LightGray</Color>
        <Color x:Key="LightColor">LightGray</Color>
    </ResourceDictionary>
</ContentPage.Resources>

<StackLayout>
    <Frame>
    <ScrollView>
        <Grid VerticalOptions="FillAndExpand"
          ColumnSpacing="20"
          HorizontalOptions="FillAndExpand">
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="Auto"/>
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto"/>
                <ColumnDefinition Width="5*"/>
                <ColumnDefinition Width="5*"/>
            </Grid.ColumnDefinitions>

                <local:CreditCardDisplayView Grid.Row="0"
                                             Grid.Column="0"
                                             Grid.ColumnSpan="3"/>

                <Frame HasShadow="false"
                  Padding="10"
                  BorderColor="{StaticResource LightColor}"
                  Margin="30,30,30,10"
                  Grid.Row="1"
                  Grid.Column="0"
                  Grid.ColumnSpan="3">
                <StackLayout Orientation="Horizontal"
                           Spacing="20">
                    <Image Source="{Binding CardNumber,Converter={StaticResource CardConverter}}"
                           HeightRequest="30"/>

                    <Entry HorizontalOptions="FillAndExpand"
                           Keyboard="Numeric"
                           Text="{Binding CardNumber, Mode=TwoWay}"
                           Visual="Custom">
                        <Entry.Behaviors>
                            <fastEntry:XamarinFastEntryBehaviour Mask="####-####-####-####" 
                                                                   MaxLength="19"/>
                        </Entry.Behaviors>
                    </Entry>
                </StackLayout>
            </Frame>

            <Frame HasShadow="false"
                  Padding="10"
                  BorderColor="{StaticResource LightColor}"
                  Margin="30,0,0,0"
                  Grid.Row="2"
                  Grid.Column="0"
                  Grid.ColumnSpan="2">

                <StackLayout Orientation="Horizontal">
                    <Image Source="ic_date"
                           HeightRequest="25"/>
                    <Entry HorizontalOptions="FillAndExpand"
                           Keyboard="Numeric"
                           Text="{Binding CardExpirationDate}"
                           Visual="Custom">
                        <Entry.Behaviors>
                            <fastEntry:XamarinFastEntryBehaviour Mask="##/##" 
                                                               MaxLength="19"/>
                        </Entry.Behaviors>
                    </Entry>
                </StackLayout>
            </Frame>

            <Frame HasShadow="false"
                   Padding="10"
                  BorderColor="{StaticResource LightColor}"
                  Margin="0,0,30,0"
                  Grid.Row="2"
                  Grid.Column="2">
                <StackLayout Orientation="Horizontal">
                    <Image Source="ic_cvv"
                          HeightRequest="25"/>
                    <Entry HorizontalOptions="FillAndExpand"
                          Keyboard="Numeric"
                          Text="{Binding CardCvv}"
                          Visual="Custom">
                        <Entry.Behaviors>
                            <fastEntry:XamarinFastEntryBehaviour Mask="###" 
                                                               MaxLength="3"/>
                        </Entry.Behaviors>
                    </Entry>
                </StackLayout>
            </Frame>

            <CheckBox Color="LightGray"
                     WidthRequest="30"
                     HorizontalOptions="Start"
                     Margin="30,0,0,0"
                     Visual="Material"
                     Grid.Row="3"
                     Grid.Column="0"/>

            <Label Text="I agree to terms and conditions."
                   TextColor="{StaticResource PrimaryDark}"
                   FontSize="16"
                   VerticalOptions="Center"
                   Grid.Row="3"
                   Grid.Column="1"
                   Grid.ColumnSpan="2"/>

            <Label Text="Make request for "
                     Grid.Row="4"
                     Grid.Column="0"
                     Grid.ColumnSpan="3"
                     TextColor="{StaticResource PrimaryDark}"
                     VerticalOptions="Center"
                     FontSize="18"
                     Padding="18"
                     Margin="30,0"/>

            <BoxView HorizontalOptions="FillAndExpand"
                     Color="{StaticResource Secondary}"
                     Visual="Default"
                     HeightRequest="1"
                     Margin="0,30"
                     Grid.Row="5"
                     Grid.Column="0"
                     Grid.ColumnSpan="3"/>

            <Button Text="Pay"
                     BackgroundColor="{Binding CardNumber, Converter={StaticResource CardColorConverter}}"
                     CornerRadius="26"
                     FontSize="18"
                     Grid.Row="6"
                     Grid.Column="0"
                     Grid.ColumnSpan="3"
                     Padding="18"
                     TextColor="White"
                     Margin="30,0,30,30"/>
        </Grid>
    </ScrollView>
    </Frame>
</StackLayout>

我运行进入错误的地方是:

<local:CreditCardDisplayView Grid.Row="0"
                             Grid.Column="0"
                             Grid.ColumnSpan="3"/>

错误说: 'CreditCardDisplayView' 类型的值无法添加到 'IGridList`1'.

类型的集合或字典中

我的 CreditCardDisplayView 代码:

    <?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="MowSnow.Views.CreditCardDisplayView">
    <ContentPage.Content>
        <StackLayout xmlns="http://xamarin.com/schemas/2014/forms" 
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             BackgroundColor="{StaticResource Primary}"
             HorizontalOptions="FillAndExpand"
             VerticalOptions="Start">
            <Frame Margin="40,10,40,30"
                   Padding="20"
                   Visual="Material"
                   BackgroundColor="{Binding CardNumber, Converter={StaticResource CardColorConverter}}">
                <Grid ColumnSpacing="30"
                      RowSpacing="0">
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto"/>
                        <RowDefinition Height="Auto"/>
                        <RowDefinition Height="40"/>
                        <RowDefinition Height="Auto"/>
                        <RowDefinition Height="40"/>
                    </Grid.RowDefinitions>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="Auto"/>
                        <ColumnDefinition Width="*"/>
                    </Grid.ColumnDefinitions>
                    <Image Source="{Binding CardNumber, Converter={StaticResource CardLightConverter}}"
                           HeightRequest="40"
                           Grid.Row="0"
                           Grid.Column="1"
                           HorizontalOptions="EndAndExpand"/>

                    <Label Text="Card Number"
                           LineBreakMode="TailTruncation"
                           FontSize="12"
                           TextColor="{StaticResource Accent}"
                           Grid.Row="1"
                           Grid.Column="0"
                           Grid.ColumnSpan="2"/>

                    <Label Text="{Binding CardNumber}"
                            FontSize="20"
                            TextColor="{StaticResource Secondary}"
                            Grid.Row="2"
                            Grid.Column="0"
                            Grid.ColumnSpan="2"/>

                    <Label Text="Expiration"
                           Margin="0,20,0,0"
                           FontSize="12"
                           TextColor="{StaticResource Accent}"
                           Grid.Row="3"
                           Grid.Column="0"/>

                    <Label Text="{Binding CardExpirationDate}"
                            FontSize="20"
                            TextColor="{StaticResource Secondary}"
                            Grid.Row="4"
                            Grid.Column="0"/>

                    <Label Text="Cvv"
                            Margin="0,20,0,0"
                           FontSize="12"
                           TextColor="{StaticResource Accent}"
                           Grid.Row="3"
                           Grid.Column="1"/>

                    <Label Text="{Binding CardCvv}"
                            FontSize="20"
                            TextColor="{StaticResource Secondary}"
                            Grid.Row="4"
                            Grid.Column="1"/>
                </Grid>
            </Frame>
        </StackLayout>
    </ContentPage.Content>
</ContentPage>

在博客中这样做是可行的。我假设它是以前的版本,或者我遗漏了一个关键部分。

发生这种情况的原因很简单,您正在尝试将内容页面添加到不可能的视图中。

ContentPage 是类型页面,而 UI 项应该是类型 View,因此无法在其中添加 ContentPage。

但是,如果您的 CreditCardDisplayView 中没有任何页面级依赖项,您可以使用一个快速修复方法,即用 ContentView 替换 ContentPage。

反过来,这将使它成为一个视图,因此可以重复使用。

 <?xml version="1.0" encoding="utf-8" ?>
<ContentView 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="MowSnow.Views.CreditCardDisplayView">
<ContentView.Content>
    <StackLayout xmlns="http://xamarin.com/schemas/2014/forms" 
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         BackgroundColor="{StaticResource Primary}"
         HorizontalOptions="FillAndExpand"
         VerticalOptions="Start">
        <Frame Margin="40,10,40,30"
               Padding="20"
               Visual="Material"
               BackgroundColor="{Binding CardNumber, Converter={StaticResource CardColorConverter}}">
            <Grid ColumnSpacing="30"
                  RowSpacing="0">
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto"/>
                    <RowDefinition Height="Auto"/>
                    <RowDefinition Height="40"/>
                    <RowDefinition Height="Auto"/>
                    <RowDefinition Height="40"/>
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto"/>
                    <ColumnDefinition Width="*"/>
                </Grid.ColumnDefinitions>
                <Image Source="{Binding CardNumber, Converter={StaticResource CardLightConverter}}"
                       HeightRequest="40"
                       Grid.Row="0"
                       Grid.Column="1"
                       HorizontalOptions="EndAndExpand"/>

                <Label Text="Card Number"
                       LineBreakMode="TailTruncation"
                       FontSize="12"
                       TextColor="{StaticResource Accent}"
                       Grid.Row="1"
                       Grid.Column="0"
                       Grid.ColumnSpan="2"/>

                <Label Text="{Binding CardNumber}"
                        FontSize="20"
                        TextColor="{StaticResource Secondary}"
                        Grid.Row="2"
                        Grid.Column="0"
                        Grid.ColumnSpan="2"/>

                <Label Text="Expiration"
                       Margin="0,20,0,0"
                       FontSize="12"
                       TextColor="{StaticResource Accent}"
                       Grid.Row="3"
                       Grid.Column="0"/>

                <Label Text="{Binding CardExpirationDate}"
                        FontSize="20"
                        TextColor="{StaticResource Secondary}"
                        Grid.Row="4"
                        Grid.Column="0"/>

                <Label Text="Cvv"
                        Margin="0,20,0,0"
                       FontSize="12"
                       TextColor="{StaticResource Accent}"
                       Grid.Row="3"
                       Grid.Column="1"/>

                <Label Text="{Binding CardCvv}"
                        FontSize="20"
                        TextColor="{StaticResource Secondary}"
                        Grid.Row="4"
                        Grid.Column="1"/>
            </Grid>
        </Frame>
    </StackLayout>
</ContentView.Content>

而在你的另一部分class

public partial class CreditCardDisplayView: ContentView

查看 link 以获取有关 ContentView 的信息:https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/layouts/contentview

Goodluck有什么问题欢迎随时提问!