部分声明不得指定不同的基类

时间:2016-05-12 04:15:54

标签: xamarin xamarin.android xamarin.forms xamarin-studio

我反复收到此错误消息:部分声明不得指定不同的基类。有人可以告诉我这可能是什么原因。这是我的代码。

CashAdvancePage.xaml

    <?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="ebmsMobile.CashAdvancePage"
             Title="Cash Advance"
             BackgroundImage="bg3.jpg">
  <Label Text="This is the Cash Advance Page." VerticalOptions="Center" HorizontalOptions="Center" />
</ContentPage>

CashAdvancePage.xaml.cs

 using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;

using Xamarin.Forms;

namespace ebmsMobile
{
    public partial class CashAdvancePage : ViewCell
    {
        public CashAdvancePage()
        {
            //InitializeComponent();
            //NavigationPage.SetHasNavigationBar(this, false);

            var image = new Image
            {
                HorizontalOptions = LayoutOptions.Start
            };
            image.SetBinding(Image.SourceProperty, new Binding("ImageUri"));
            image.WidthRequest = image.HeightRequest = 40;

            var nameLayout = CreateNameLayout();
            var viewLayout = new StackLayout()
            {
                Orientation = StackOrientation.Horizontal,
                Children = { image, nameLayout }
            };
            View = viewLayout;


        }

        static StackLayout CreateNameLayout()
    {
        var nameLabel = new Label
        {
            HorizontalOptions= LayoutOptions.FillAndExpand
        };
        nameLabel.SetBinding(Label.TextProperty, "DisplayName");

        var twitterLabel = new Label
        {
           HorizontalOptions = LayoutOptions.FillAndExpand,
           Font = Fonts.Twitter
        };
        twitterLabel.SetBinding(Label.TextProperty, "Twitter");

        var nameLayout = new StackLayout()
        {
           HorizontalOptions = LayoutOptions.StartAndExpand,
           Orientation = StackOrientation.Vertical,
           Children = { nameLabel, twitterLabel }
        };
        return nameLayout;
    }
    }
}

4 个答案:

答案 0 :(得分:3)

当您在XAML文件中将其用作Rootelement时,需要从.cs中继承ContentPage。

另一个问题是,您需要将“viewLayout”分配给Content而不是View。

using Xamarin.Forms;

namespace ebmsMobile
{
public partial class CashAdvancePage : ContentPage // derive from ContentPage
{
    public CashAdvancePage()
    {
        //InitializeComponent();
        //NavigationPage.SetHasNavigationBar(this, false);

        var image = new Image
        {
            HorizontalOptions = LayoutOptions.Start
        };
        image.SetBinding(Image.SourceProperty, new Binding("ImageUri"));
        image.WidthRequest = image.HeightRequest = 40;

        var nameLayout = CreateNameLayout();
        var viewLayout = new StackLayout()
        {
            Orientation = StackOrientation.Horizontal,
            Children = { image, nameLayout }
        };
        Content = viewLayout; // <-- Set the ViewLayout as Content


    }

    static StackLayout CreateNameLayout()
    {
        var nameLabel = new Label
        {
            HorizontalOptions = LayoutOptions.FillAndExpand
        };
        nameLabel.SetBinding(Label.TextProperty, "DisplayName");

        var twitterLabel = new Label
        {
            HorizontalOptions = LayoutOptions.FillAndExpand,
       //     Font = Fonts.Twitter
        };
        twitterLabel.SetBinding(Label.TextProperty, "Twitter");

        var nameLayout = new StackLayout()
        {
            HorizontalOptions = LayoutOptions.StartAndExpand,
            Orientation = StackOrientation.Vertical,
            Children = { nameLabel, twitterLabel }
        };
        return nameLayout;
    }
}
}

答案 1 :(得分:1)

你在这里混合了两个不同的东西:一个页面和一个视图单元格。

可以通过代码和使用XAML创建页面和视图单元格,但它们是分开的。

在XAML中创建任何组件时,无论是页面还是视图,根节点类型必须是您要子类化的类型。 然后,.cs文件后面的代码必须从相同的基类派生,或者你可以在代码隐藏中完全省略基类,因为部分类不必重新声明它们派生的类。

因此,对于CashAdvance页面定义,请务必从代码隐藏中的类定义中删除“:ViewCell”部分。

然后你应该在XAML中构建你的页面(否则,无论如何,如果你在代码中构建它,那么使用xaml页面有什么意义呢?)

如果你确实需要一个自定义的视单元(例如,在ListView中使用),那么为你的viewcell创建另一个.xaml文件,并在那里构建它自己的ui。 然后,您可以在页面XAML中或从代码隐藏中引用它。

有关使用XAML的更多详细信息,请查看the Xamarin XAML documentation

答案 2 :(得分:0)

一般而言,请将xaml主标签与.cs文件中的继承匹配,以防止发生不同的基类错误 所以如果:

<contentPage xmlns="http://xamarin......> </contentPage >

.cs文件通常为

public partial class myPage : contentPage { ........}

答案 3 :(得分:0)

作为较晚的条目...

万一您想为页面创建基类...但是失败了。您可以从其他基类继承。

这是...

1:创建一个基础类页面(带有类背后的代码)
例如,这是我的,但您的可能会不同...

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="Pulse.Mobile.Views.BaseContentPage">
</ContentPage>


public partial class BaseContentPage : ContentPage
{
    #region <Fields & Constants>

    protected Style ValidationEntryErrorStyle = Application.Current.Resources["ValidationEntryErrorStyle"] as Style;
    protected Style FormEntryStyle = Application.Current.Resources["FormEntryStyle"] as Style;

    #endregion

    #region <Constructors>

    public BaseContentPage()
    {
        InitializeComponent();
    }

    #endregion

    #region <Events>

    protected override void OnAppearing()
    {
        base.OnAppearing();

        LogHelper.Trace($"Screen - {this}", "Browsed");
    }

    #endregion

    #region <Methods>

    protected bool ValidateKeyPress(Entry entry, TextChangedEventArgs e, string regularExpression)
    {
        var text = e.NewTextValue;

        // Allow Empty
        if(string.IsNullOrWhiteSpace(text))
            return true;

        var result = Regex.IsMatch(e.NewTextValue, regularExpression);
        return result;
    }

    protected void ValidateStyle(Entry control, bool isValid)
    {
        switch (isValid)
        {
            case false:
                control.Style = ValidationEntryErrorStyle;
                break;

            default:
                control.Style = FormEntryStyle;
                break;
        }
    }

    protected void ValidateStyle(Picker control, bool isValid)
    {
        switch (isValid)
        {
            case false:
                control.Style = ValidationEntryErrorStyle;
                break;

            default:
                control.Style = null;
                break;
        }
    }

    #endregion
}

2:在您的PAGE中引用基础类页面
确保在“ xmlns:views”中引用您的视图。请特别注意标记的根元素:

<?xml version="1.0" encoding="utf-8" ?>
<views:BaseContentPage xmlns="http://xamarin.com/schemas/2014/forms"
                       xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
                       xmlns:views="clr-namespace:Pulse.Mobile.Views;assembly=Pulse.Mobile"
                       x:Class="Pulse.Mobile.Views.ShakeoutDocumentPage">
    <ContentPage.Content>

        // YOUR AWESOME CONTENT GOES HERE...

    </ContentPage.Content>
</views:BaseContentPage>