Это текущий код, который у меня есть:
<?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="WPapp.Views.Post">
<ContentPage.Content>
<ScrollView>
<StackLayout Margin="10"
HorizontalOptions="Center"
VerticalOptions="FillAndExpand"
x:Name="PostContainer">
<Image x:Name="FeaturedImage"
HorizontalOptions="Center"/>
<Label x:Name="Title"
FontSize="Title"
FontAttributes="Bold"
Margin="0, 20, 0, 10"/>
<Label x:Name="PostMeta"
FontSize="Caption"
FontAttributes="None"
Margin="0, 0, 0, 0"/>
</StackLayout>
</ScrollView>
</ContentPage.Content>
</ContentPage>
Image image = new Image();
image.Source = imageSource;
image.Aspect = Aspect.AspectFill;
PostContainer.Children.Add(image);
Это изображение:
Это является результатом:
Изображение заполняется по горизонтали, как и предполагалось.
Проблема в том, что изображение обрезается по вертикали . Как я могу предотвратить обрезку изображения и как отобразить полное изображение без растягивания?
Как показано в ответе ниже, чтобы изменить размер изображения так, чтобы его ширина соответствовала максимальной ширине Контейнер StackLayout без обрезки, мне нужно было установить HeightRequest изображения.
Я получаю сообщения с веб-сайта WordPress. Для синтаксического анализа ответа JSON от Wordpress REST API я использую пакет WordpressPCL. Чтобы проанализировать вывод HTML, который я получаю от WordpressPCL для получения содержимого публикации по методу идентификатора, я использую HTML Agility Pack.
С помощью HTML Agility Pack я смог получить идентификатор мультимедиа Wordpress, этот идентификатор затем использовался для запроса API Wordpress и получения исходной ширины и высоты изображения и текста заголовка с помощью пакета WordpressPCL.
Исходя из размеров изображения, я рассчитал соотношение сторон . С соотношением сторон я смог рассчитать новую высоту изображения, умножив соотношение сторон на общую ширину экрана минус 20. 20 - это левое поле + правое поле StackLayout, который является родительским элементом изображения.
Все изображения теперь имеют полную ширину, чтобы соответствовать ширине родительского контейнера, и не обрезаются (высота 100%).
Код приведен ниже (за исключением кода, который отвечает за разбор остальное содержимое сообщения Wordpress):
Uri imageSource = new Uri(figure.GetAttributeValue("src", "").ToString());
Int32.TryParse(figure.GetAttributeValue("data-attachment-id", "").ToString(), out int mediaID);
string caption = null;
double aspectRatio = 0;
Task.Run(() =>
{
Constants wpsite = new Constants();
var client = new WordPressClient(wpsite.resturl);
var caption_task = client.Media.GetByID(mediaID);
caption_task.Wait();
caption = caption_task.Result.Caption.Rendered;
double height = caption_task.Result.MediaDetails.Height;
double width = caption_task.Result.MediaDetails.Width;
aspectRatio = height / width;
var htmlCaption = new HtmlDocument();
htmlCaption.LoadHtml(caption);
caption = WebUtility.HtmlDecode(htmlCaption.DocumentNode.InnerText);
}).Wait();
Image image = new Image();
image.Source = imageSource;
image.Aspect = Aspect.AspectFit;
double maxWidth = Application.Current.MainPage.Width - 20;
double imageHeight = aspectRatio * maxWidth;
image.HeightRequest = imageHeight;
Label imageCaption = new Label();
imageCaption.Text = caption;
imageCaption.HorizontalTextAlignment = TextAlignment.Center;
imageCaption.FontSize = 12;
imageCaption.Margin = new Thickness(0, 0, 0, 10);
PostContainer.Children.Add(image);
PostContainer.Children.Add(imageCaption);
Это результат: