2017-01-30 73 views
2

Xamarin表单试图确保图像与其包含列的宽度匹配时出现问题。 (想象一下带有图片和说明的简单产品列表)。Xamarin表单 - 获取图像以填充包含网格列的宽度?

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="formsApp.MainPage"> 
 
    <ContentPage.Padding> 
 
    <OnPlatform x:TypeArguments="Thickness" 
 
       iOS="20, 40, 20, 20" 
 
       Android="20, 20, 20, 20" 
 
       WinPhone="20, 20, 20, 20" /> 
 
    </ContentPage.Padding> 
 
    <ContentPage.Content> 
 
    <ScrollView> 
 
     <StackLayout VerticalOptions="FillAndExpand" 
 
        HorizontalOptions="FillAndExpand" 
 
        Orientation="Vertical" 
 
        Spacing="15" > 
 
     <Grid x:Name="testGrid" VerticalOptions="Center"> 
 
     </Grid> 
 
     </StackLayout> 
 
    </ScrollView> 
 
    </ContentPage.Content> 
 
</ContentPage>

C#代码后面是:

public MainPage() 
    { 
     InitializeComponent(); 

     testGrid.BackgroundColor = Color.Gray; 
     testGrid.Padding = new Thickness(10D); 
     testGrid.RowDefinitions = new RowDefinitionCollection(); 
     testGrid.ColumnDefinitions = new ColumnDefinitionCollection(); 

     testGrid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) }); 
     testGrid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(3, GridUnitType.Star) }); 

     for (int MyCount = 0; MyCount < 20; MyCount++) 
     { 
      testGrid.RowDefinitions.Add(new RowDefinition { Height = new GridLength(1, GridUnitType.Star) }); 
     } 

     for (int i = 0; i < testGrid.RowDefinitions.Count(); i++) 
     { 
      StackLayout st = new StackLayout() { Orientation = StackOrientation.Horizontal, HorizontalOptions = LayoutOptions.Center, IsClippedToBounds = true }; 

      st.Children.Add(new Image 
      { 
       Source = ImageSource.FromUri(new Uri("https://lh3.googleusercontent.com/nYhPnY2I-e9rpqnid9u9aAODz4C04OycEGxqHG5vxFnA35OGmLMrrUmhM9eaHKJ7liB-=w300")), 
       Aspect = Aspect.AspectFit, 
       HorizontalOptions = LayoutOptions.EndAndExpand 
      }); 

      testGrid.Children.Add(st, 0, i); 

      testGrid.Children.Add(new Label 
       { 
        Text = "Row" + i + " description.... fdsfsdf sdf sdfsd fsdf sdf sdf sdfsd fsd fsdf sdf sd fsd fsdf " 
      }, 1, i); 

     } 

    } 

我已应用的各种选项,例如在堆叠布局包裹所述图像(带有选项在堆栈布局上),并且将AspectFit和EndAndExpand添加到图像中,但它绝不是100%正确的。 Resultant view from a 5" KitKat Android Emulator

有什么建议吗?

感谢

回答

1

我觉得这里的问题是EndAndExpand水平选项。据我所知,如果内容不适合其他的话,各个视图都会扩展。此外,您已将网格的列宽设置为*3*,这意味着第一列将占用网格宽度的四分之一,因此没有可扩展的空间。

这个问题有多种可能的解决方案 - 取决于你希望结果的外观。你可以去Auto*关于列

<Grid.ColumnDefinitions> 
    <ColumnDefinition Width="Auto" /> 
    <ColumnDefinition Width="*" /> 
</Grid.ColumnDefinitions> 

,或者你可以使图像只使用了可用空间

st.Children.Add(new Image 
{ 
    Source = "...", 
    Aspect = Aspect.AspectFit, 
    HorizontalOptions = LayoutOptions.Fill 
}); 

两个选项应该可以解决你的问题。

但是,请注意,你甚至可以做得更好。而不是使用网格,您可以使用ListView。使用ListView,您可以使用数据绑定功能来处理您的单元格。您不必使用所有构建视图的代码来混淆您的代码,但可以在纯XAML中声明所有内容。

+0

感谢您的支持。我去了第二个确实解决问题的选项。但是我注意到了其他一些东西: 如果原始图像对于空间来说太大,那么行高会扩展到原始大小(宽度很好),尽管实际生成的图像在顶部很好地放置正确。底部有这么大的空间吗? –