Xamarin — получение контрольных измерений

#xamarin.forms

#xamarin.формы

Вопрос:

Я действительно не знаю, как получить контрольные размеры в формах Xamarin. Я думал, что это будет так же просто, как:

 View control = GetControlSomehow(); var bounds = control.Bounds;  

Но Посмотрите.Границы возвращают разные значения в зависимости от того, находится ли элемент управления внутри сетки или нет; или является ли основной макет абсолютным или каким-либо другим.

Например, если я сделаю что-то вроде:

 lt;AbsoluteLayoutgt;  lt;Button AbsoluteLayout.LayoutBounds="200,200" x:Name="btn" Text="Btn"/gt; lt;/AbsoluteLayoutgt;  

тогда я не могу прочитать фактическую высоту или ширину этой кнопки. Хотя MSDN говорит, что свойства высоты и ширины должны возвращать эти значения.

Я пытался даже:

 var width = ctrl.Width;  

или

 var width = ctrl.GetValue(WidthProperty);  

Но на самом деле ни одно из них не сработало. Я всегда получаю -1

Итак, как я могу получить контрольные размеры, которые могли бы быть надежными?

Комментарии:

1. как вы пытаетесь прочитать высоту и ширину? Вы ждете, пока макет завершится, прежде чем пытаться?

2. Все это заряжено. Например, когда появляется моя страница, я нажимаю какую-то кнопку, а затем хочу получить размеры

3. Чтобы помочь другим в будущем с подобной проблемой, пожалуйста, добавьте в свой вопрос код, который не работал . Затем это становится полным вопросом и ответом, показывающим, что не сработало, и показывающим ответы об альтернативных способах решения.

Ответ №1:

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

AbsoluteLayoutPage.xaml:

 lt;ContentPage xmlns="http://xamarin.com/schemas/2014/forms"  xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"  x:Class="TestBugs.AbsoluteLayoutPage"gt;  lt;ContentPage.Contentgt;  lt;AbsoluteLayoutgt;  lt;Button AbsoluteLayout.LayoutBounds="200,200" x:Name="btn" Text="Btn"  Command="{Binding ButtonCommand}" CommandParameter="{x:Reference btn}"/gt;  lt;/AbsoluteLayoutgt;  lt;/ContentPage.Contentgt; lt;/ContentPagegt;  

AbsoluteLayoutPage.xaml.cs:

 using System.Diagnostics; using Xamarin.Forms; using Xamarin.Forms.Xaml;  namespace TestBugs {  [XamlCompilation(XamlCompilationOptions.Compile)]  public partial class AbsoluteLayoutPage : ContentPage  {  public AbsoluteLayoutPage()  {  ButtonCommand = new Command(ButtonClick);  InitializeComponent();  BindingContext = this;  }   private void ButtonClick(object ob)  {  var button = ob as View;  var bounds = btn.Bounds;  var width = btn.Width;  var height = btn.Height;  Debug.WriteLine($"--- ButtonClick {bounds}, ({width},{height})---");   }   public Command ButtonCommand { get; set; }  } }  

При нажатии кнопки в области вывода VS:

 [0:] --- ButtonClick {X=200 Y=200 Width=88 Height=48}, (88,48)---  

Ответ №2:

это работает для меня

 lt;Button Text="Click" Clicked="Clicked" /gt;  public void Clicked(object sender, EventArgs a)  {  var btn = (Button)sender;   var w = btn.Width;  var h = btn.Height;   DisplayAlert("Dimesions", $"{w}x{h}","OK");   }  

Комментарии:

1. Это не работает, я просто получаю -1

2. @AdamJachocki — Пожалуйста, добавьте нерабочий код в вопрос . Я подтвердил, что ответ Джейсона работает как на Android, так и на UWP. Поэтому проблема в том, как вы его используете. ПРИМЕЧАНИЕ: «-1» означает, что вы тестируете представление, которое не было выложено . (Что происходит непосредственно перед тем, как оно становится видимым на экране.) Каким-то образом вы не имеете в виду реальную кнопку, которая видна на экране. ИЛИ вы имеете в виду значение, которое оно имело до того, как стало видимым. ИЛИ в XAML есть что-то еще, что вы не показали.

Ответ №3:

Извините, ребята, я виноват. Я тестировал его на двух страницах — настоящей и тестовой. Тестовая страница построена по-другому, и я подтверждаю, что проблема возникла вовремя, когда я извлек эти значения. Контроль еще не был расписан.

Поэтому я действительно сожалею, что беспокою вас, и благодарю всех вас за то, что вы вложили в это свое время.

Комментарии:

1. Нет проблем — это случается со всеми нами. Рад, что ты с этим разобрался!