#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. Нет проблем — это случается со всеми нами. Рад, что ты с этим разобрался!