2016-04-06 2 views
0

у меня есть что-то вроде этого до сих пор на мой взгляд:кнопка на верхней части Scrollview не обнаруживается

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; 
} 

Однако, я заметил, что кнопка даже не отображать на представлении Погасить (Это должно фиксируется на дне).

Скроллвью работает, но отсутствует звук. Зачем?

Пожалуйста, дайте мне знать, если вам нужны дальнейшие детали кода.

+0

Вы пробовали использовать различные разрешения экрана или устройства? с более крупным устройством он отключается, если да, то лучше проверить свойства запроса ширины и ширины прокладки и расстояния! –

+0

@ MarioGalván, да, он обрезается. Какие свойства точно (имя мудрый), и нужно ли я проверять компоновку стека или конкретные элементы? –

+0

Все элементы, макеты и представления, также проверяют VerticalOptions, которые могут помешать использованию FillAndExpand, Xamarin предлагает оставить Вертикальные и Горизонтальные параметры, как есть (по умолчанию). –

ответ

1

Перемещение здесь из комментариев выше. Есть два отдельных вопроса от того, что я могу сказать, и насколько я могу судить, не имеют никакого отношения:

  1. WebView, вложенными внутри ScrollView, не является достаточно большим, чтобы полностью отобразить содержимое.
  2. Кнопка, которая должна находиться в нижней части экрана, не отображается.

Для обоих из них ответ, вероятно, заключается в том, как вы устанавливаете HeightRequest. Было много предложений от меня и других комментаторов, чтобы изменить или избавиться от некоторых настроек HeightRequest, и я не уверен в текущем состоянии исходного кода. Так предполагая те все еще есть:

  1. Для решения вопроса WebView, читайте How can I add HTML to a Stacklayout inside a Scrollview in Xamarin forms?. Это позволит вам определить правильное значение HeightRequest для использования. Короткий ответ заключается в том, что в зависимости от того, что вы хотите, вам может понадобиться собственный рендерер.Обратите внимание, что значение HeightRequest для WebView не влияет на какой-либо макет вне ScrollView.

  2. Для решения проблемы кнопки, не появляющейся, избавиться от параметра HeightRequest на ScrollView и VerticalOptions в StackLayout, созданного в SavedButtonLayout.

Я предполагаю, что вы сделали эксперимент было предложено выше, чтобы убедиться, что redeemBtn сделает, если их поместить перед ScrollView, и он появляется тогда. Если нет, сначала нужно исправить это.

+0

Две вещи 1) Я избавился от HeightRequest на ScrollView 2) Я избавился от VeritcalOptions на SavedButtonLayout. Я должен избавиться от чего-либо на mainStackLayout, что ScrollView вложен внутри? Нужно ли мне избавляться от VerticalOptions на mainScrollView? Благодаря! У меня нет проблемы с содержимым, которое больше не отображается в веб-просмотре, так как я добавил более длинный запрос heightrequest. Тем не менее, единственная проблема теперь в том, что кнопка не отображается (но она появляется, если я ставлю ее частью SavedButtonLayout). –

+0

Обновлен мой код в моем сообщении. Взгляните, когда у вас есть время. В очередной раз благодарим за помощь! –

0

Ваш макет довольно занят. Несколько вещей:

  1. Набор VerticalOptions в EndAndExpand для redeemBtn.
  2. VerticalOptions до StartAndExpand для savedBtn.
  3. Комплект VerticalOptions до Fill для mainScrollView.
  4. Комплект VerticalOptions до FillAndExpand для mainRelLayout.
  5. VerticalOptions и HorizontalOptions до Fill для mainStackLayout.

Я думаю, что вы попадете туда, где вы хотите быть.

Опции, которые включают «Развернуть», будут увеличивать элемент, чтобы обеспечить требуемую высоту его содержимого.

+0

VerticalOptions для redeemBtn и savedBtn ... для самой кнопки или для StackLayout? –

+0

В любом случае, все еще не полностью прокручиваемый с внесенными вами изменениями ... Спасибо за вашу помощь! –

1

Если вы исправили это, изменив значение HeightRequest, то ваша реальная проблема - фиксированный размер пикселя всех ваших взглядов и макетов, я рекомендую вам НЕ использовать фиксированные размеры пикселей для разных разрешений экрана, это будет больше проблема позже. Что вы можете сделать, так это получить размер экрана и выполнить математику, чтобы она соответствовала всем вашим элементам представления, один из способов получить ширину и высоту экрана - это событие OnSizeChangedPages (например, ContentPage), что-то вроде это:

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

Могу ли я использовать это для изменения размера кнопки при изменении текста? –

+0

По тексту вы имеете в виду ярлык или текст внутри записи? –

+0

Я имею в виду кнопку. Измените размер кнопки, если текст внутри текста изменит длину. –

Смежные вопросы