Как выровнять элементы выбора всплывающих окон в пользовательском рендерере в Xamarin? - PullRequest
0 голосов
/ 08 февраля 2019

Я занимаюсь разработкой приложения Xamarin для Android и iOS.эта проблема специально для Android.Я пытаюсь отобразить всплывающее окно выбора с элементами, выровненными по левому краю, с длинным текстом, который можно прокручивать по горизонтали (чтобы можно было просмотреть весь текст), и имеет границы сверху и снизу текущего выбранного элемента колеса.Я не могу заставить текстовые элементы выбора появляться слева с небольшим отступом и все еще прокручивать по горизонтали.Он может показаться многострочным, но до тех пор, пока у него все еще есть верхняя и нижняя границы для идентификации выбранного элемента.

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

picker.LayoutMode = ViewLayoutMode.ClipBounds;
picker.SetClipToPadding(false);
picker.SetHorizontalGravity(GravityFlags.Start);
picker.TextAlignment = TextAlignment.TextStart;

XAML:

<controls:ImagePicker HeightRequest="40" FontSize="Small" HorizontalOptions="FillAndExpand" x:Name="pkrSystem">
    <Picker.Effects>
         <effects:BackgroundEffect />
    </Picker.Effects>
</controls:ImagePicker>

пользовательский рендерер в проекте Android:

[assembly: ExportRenderer(typeof(ImagePicker), typeof(ImagePickerRenderer))]
namespace ClientApp.Droid.Renderers
{
public class ImagePickerRenderer : PickerRenderer
    {
        private IElementController ElementController => Element as IElementController;
        private AlertDialog _dialog;

        public ImagePickerRenderer(Context context) : base(context)
        {

        }

        protected override void OnElementChanged(ElementChangedEventArgs<Picker> e)
        {
            base.OnElementChanged(e);

            if (Control != null)
            {
                Control.Click += Control_Click;
            }
        }

        protected override void Dispose(bool disposing)
        {
            Control.Click -= Control_Click;
            base.Dispose(disposing);
        }

        private void Control_Click(object sender, EventArgs e)
        {
            Picker model = Element;

            var picker = new NumberPicker(Context);
            if (model.Items != null && model.Items.Any())
            {
                picker.MaxValue = model.Items.Count - 1;
                picker.MinValue = 0;
                picker.SetDisplayedValues(model.Items.ToArray());
                picker.WrapSelectorWheel = false;
                picker.DescendantFocusability = DescendantFocusability.BlockDescendants;
                picker.Value = model.SelectedIndex;
                picker.SetFitsSystemWindows(true);
                //picker.LayoutMode = ViewLayoutMode.ClipBounds;
                //picker.SetClipToPadding(false);
                //picker.SetHorizontalGravity(GravityFlags.ClipHorizontal);
                //picker.TextAlignment = TextAlignment.TextStart;
            }

            var layout = new LinearLayout(Context) { Orientation = Orientation.Vertical };
            layout.AddView(picker);
            ElementController.SetValueFromRenderer(VisualElement.IsFocusedProperty, true);

            var builder = new AlertDialog.Builder(Context);
            builder.SetView(layout);
            builder.SetTitle(model.Title ?? "");
            builder.SetNegativeButton("Cancel", (s, a) =>
            {
                ElementController.SetValueFromRenderer(VisualElement.IsFocusedProperty, false);
                Control?.ClearFocus();
                _dialog = null;
            });
            builder.SetPositiveButton("Ok", (s, a) =>
            {
                ElementController.SetValueFromRenderer(Picker.SelectedIndexProperty, picker.Value);
                if (Element != null)
                {
                    if (model.Items.Count > 0 && Element.SelectedIndex >= 0)
                        Control.Text = model.Items[Element.SelectedIndex];                    
                    ElementController.SetValueFromRenderer(VisualElement.IsFocusedProperty, false);                    
                    Control?.ClearFocus();
                }
                _dialog = null;
            });

            _dialog = builder.Create();
            _dialog.DismissEvent += (ssender, args) =>
            {
                ElementController?.SetValueFromRenderer(VisualElement.IsFocusedProperty, false);
            };
            _dialog.Show();
        }
    }

}

Ожидаемый результат: сборщиктекст элемента, отображаемый слева с небольшим отступом и полностью прокручиваемый по горизонтали, или текст элемента выбора является многострочным, поэтому может просматривать полный текст и по-прежнему распознаваться по верхней и нижней границам.expected ожидаемый снимок экрана: https://imgur.com/a/VrangdD

Фактический результат: текст элемента средства выбора появляется в середине каждого всплывающего элемента средства выбора, а затем попробуйте прокрутить влево, если он обрезал некоторый текст, поэтому невозможно полностью прокрутить влево, чтобы просмотреть полный тексттекст, в настоящее время отображается как однострочный текст.Верхняя и нижняя границы отображаются правильно.actual фактический скриншот: https://imgur.com/a/XGCZQeZ

...