Scrollview顶部的按钮不会显示

时间:2016-04-06 21:57:53

标签: c# android xamarin scrollview xamarin.forms

到目前为止,我的观点是这样的:

   public StackLayout OffersSlideViewCarouselChild(Offer offer)
{
    Image productImage = new Image
    {
        Source = ImageSource.FromUri(new Uri(offer.Image.Replace("https://", "http://"))),
        HeightRequest = 270, 
        WidthRequest = 270,
        Aspect = Aspect.AspectFit
    };

    var topStackLayout = new StackLayout
    {
        Spacing = 0

    };
    topStackLayout.Children.Add(productImage);

    StackLayout contentStackLayout = new StackLayout
    {
        Spacing = 0,
        Padding = new Thickness(5, 10, 5, 10),
        Orientation = StackOrientation.Vertical
    };
    var savedBtn = SavedButtonLayout(offer.IsSelected, offer.Id);
    var redeemBtn = RedeemBtnLayout(offer.Id);
    var timeRemainingLabel = TimeRemainingLayout(offer, offer.Id);


    contentStackLayout.Children.Add(new UILabel(16) {
        Text = offer.ProductName,
        TextColor = ColorHelper.FromHex(CoreTheme.COLOR_OFFERCELL_PRODUCT_TEXT),
        FontFamily = CoreTheme.FONT_FAMILY_DEFAULT_BOLD,
        WidthRequest = DeviceDisplaySettings.defaultwidth,
        VerticalTextAlignment = TextAlignment.Center
});

    contentStackLayout.Children.Add(new UILabel(14)
    {
        Text = offer.Headline,
        TextColor = ColorHelper.FromHex(CoreTheme.COLOR_OFFERCELL_PRODUCT_TEXT),
        FontFamily = CoreTheme.FONT_FAMILY_DEFAULT_BOLD,
        WidthRequest = DeviceDisplaySettings.defaultwidth,
        VerticalTextAlignment = TextAlignment.Center
    });

    contentStackLayout.Children.Add(new UILabel(14) {
        Text = offer.LongRewardsMessage,
        TextColor = ColorHelper.FromHex(CoreTheme.COLOR_DEAL_PAGE_LONG_REWARD_MESSAGE_RED),
        FontFamily = CoreTheme.FONT_FAMILY_DEFAULT_BOLD,
        WidthRequest = DeviceDisplaySettings.defaultwidth,
        VerticalTextAlignment = TextAlignment.Center
    });

    if (!string.IsNullOrEmpty(offer.PowerMessage)) {
        var htmlText = string.Format("<html><body style='color:#9b9b9b'>{0}</body></html>", offer.PowerMessage.Replace(@"\", string.Empty));

        var browser = new WebView() {
            //HeightRequest = (DeviceDisplaySettings.defaultheight > 600) ? 500 : 400,
            HeightRequest = 800,
            Source = new HtmlWebViewSource() { Html = htmlText },
        };
        browser.Navigating += OnNavigating;

        contentStackLayout.Children.Add(browser);
    }

    var nestedStackLayout = new StackLayout()
    {
        VerticalOptions = LayoutOptions.FillAndExpand
    };

    nestedStackLayout.Children.Add(topStackLayout);
    nestedStackLayout.Children.Add(timeRemainingLabel);
    nestedStackLayout.Children.Add(contentStackLayout);

    var mainScrollView = new ScrollView()
    {
        Padding = new Thickness(0, 0, 0, 10),
        VerticalOptions = LayoutOptions.FillAndExpand,
        Orientation = ScrollOrientation.Vertical,
        Content = nestedStackLayout
    };

    var mainStackLayout = new StackLayout()
    {
        Spacing = 5,
        Padding = new Thickness(0, 0, 0, 0),
        VerticalOptions = LayoutOptions.Fill,
        HorizontalOptions = LayoutOptions.Fill,
        Orientation = StackOrientation.Vertical,
        Children = { savedBtn, mainScrollView, redeemBtn }

    };

    return mainStackLayout;
}

private StackLayout SavedButtonLayout(bool isSelected, int offerid)
{
    int buttonsToShow = 2;
    bool displaySaveButton = true;

    if (IsPremisesOffer (offerid)) {
        buttonsToShow = 3;
        displaySaveButton = false;

    }

    btnShare = new UIFieldDefinition(_pageFieldDefinition.ShareButtonDefinition); 
    btnShare.Text = "SHARE";
    btnShare.ClassId = offerid.ToString();
    btnShare.WidthRequest = (DeviceDisplaySettings.defaultwidth / buttonsToShow) - 40;
    btnShare.BackgroundColor = Color.FromRgb(167, 188, 33);
    btnShare.VerticalContentAlignment = TextAlignment.Center;
    btnShare.HandleClick(btnShare_Clicked);


    btnSave = new UIFieldDefinition(_pageFieldDefinition.SaveButtonDefinition);
    btnSave.Text = isSelected ? "UNSAVE" : "SAVE";
    btnSave.ClassId = offerid.ToString();
    btnSave.WidthRequest = (DeviceDisplaySettings.defaultwidth / buttonsToShow) - 40;
    btnSave.BackgroundColor = Color.FromRgb(167, 188, 33);
    btnSave.VerticalContentAlignment = TextAlignment.Center;
    btnSave.HandleClick(btnSave_Clicked);

    rl = new StackLayout {
        Spacing = 10,
        Orientation = StackOrientation.Horizontal,
        BackgroundColor = Color.FromRgb(196, 221, 57),
        Padding = new Thickness(40, 5, 5, 5),
        WidthRequest = DeviceDisplaySettings.defaultwidth
    };

    rl.Children.Add(btnShare);
    if (displaySaveButton) rl.Children.Add(btnSave);

    return rl;
}

public UIFieldDefinition RedeemBtnLayout(int offerid)
{
    int buttonsToShow = 1;

    btnRedeem = new UIFieldDefinition(_pageFieldDefinition.RedeemButtonDefinition);
    btnRedeem.Text = "REDEEM NOW";
    btnRedeem.ClassId = offerid.ToString();
    btnRedeem.WidthRequest = (DeviceDisplaySettings.defaultwidth / buttonsToShow) - 10;
//  btnRedeem.HorizontalOptions = LayoutOptions.FillAndExpand;
//  btnRedeem.VerticalOptions = LayoutOptions.EndAndExpand;
    btnRedeem.HandleClick(btnRedeem_Clicked);



    return btnRedeem;
}

但是,我注意到Redeem按钮甚至没有显示在视图上(它应该固定在底部)。

scrollview可以正常工作,但是缺少了buttom。为什么?

如果您需要更多代码详细信息,请与我们联系。

3 个答案:

答案 0 :(得分:1)

如果你有&#34;固定&#34;这通过更改HeightRequest然后你真正的问题是所有视图和布局的固定像素大小,我建议你不要使用固定的像素大小来获得不同的屏幕分辨率,这将是一个更大的问题,你可以做的是获取屏幕大小并进行数学计算以适应视图的所有元素,获取屏幕宽度和高度的一种方法是OnSizeChanged事件Pages(如ContentPage),类似于这样:

SizeChanged += SizeChanged;
void SizeChanged (object sender, EventArgs e)
{
    Layout.WidthRequest = Width * 0.3;
    Layout.HeightRequest = Height * 0.35;
}

答案 1 :(得分:1)

从上面的评论移到这里。我可以分辨出两个不同的问题,据我所知,这两个问题是无关的:

  1. 嵌套在ScrollView中的WebView不够大,无法完全显示内容。
  2. 应该位于屏幕底部的按钮不显示。
  3. 对于他们两个,答案可能在于你如何设置HeightRequest。我和其他评论者提出了很多建议来改变或删除一些HeightRequest设置,而且我不确定源代码的当前状态。所以假设那些仍在那里:

    1. 要解决WebView问题,请阅读How can I add HTML to a Stacklayout inside a Scrollview in Xamarin forms?。这将让您找出要使用的正确HeightRequest。简短的回答是,根据您想要发生的具体情况,您可能需要自定义渲染器。请注意,WebView的HeightRequest不会影响ScrollView之外的任何布局。

    2. 为了解决没有出现按钮的问题,请删除ScrollView上的HeightRequest设置,以及在SavedButtonLayout中创建的StackLayout上的VerticalOptions。

    3. 我假设你做了上面建议的实验,以确保如果放在ScrollView之前,redeemBtn将呈现,然后它会显示出来。如果没有,您首先需要解决这个问题。

答案 2 :(得分:0)

你的布局非常繁忙。一些事情:

  1. VerticalOptions设为EndAndExpand {/ 1}}。
  2. redeemBtn设为VerticalOptions {/ 1}}。
  3. StartAndExpand设为savedBtn {/ 1}}。
  4. VerticalOptions设为Fill {/ 1}}。
  5. mainScrollViewVerticalOptions设为FillAndExpand mainRelLayout
  6. 我认为这会让你到达你想去的地方。

    包含&#34;展开&#34;的选项将生长元素以适应其内容的所需高度。