xamarin.forms - Xamarin Forms Android 中步进器宽度无法正确调整大小

标签 xamarin.forms xamarin.android resizable stepper

我想在我的 Xamarin Forms 项目中使用 Stepper,但它无法在 Android 中正确调整宽度大小。 WithRequest 根本不起作用,当我设置边距时,它只会调整两个按钮之一的大小,另一个按钮仍处于正常大小。

enter image description here

这是我的代码:

<Grid>
<Grid.ColumnDefinitions>
    <ColumnDefinition Width=".3*"/>
    <ColumnDefinition Width=".5*"/>
    <ColumnDefinition Width=".2*"/>
    <ColumnDefinition Width="20"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
    ...
</Grid.RowDefinitions>
...
<Stepper Grid.Row="7" Grid.Column="1" Margin="20,0,20,0"/>
</Grid>

最佳答案

I want to use a Stepper in my Xamarin Forms Project, but it won't resize the width properly in Android. The WithRequest wont work at all an when I set the margin it only resize one of the two buttons, the other one is still at it's normal size.

按钮的大小不是根据 WidthRequest 属性设置的。如果您想设置按钮的大小,则必须制作自己的步进控件。

StepperRenderer 的源代码进行一些更改的 OnElementChange 方法将使其适用于您自己的自定义控件。以下是 StepperRenderer 的修改版本:

[assembly:ExportRenderer(typeof(MyStepper),typeof(MyStepperRenderer))]
namespace StepperDemo.Droid
{
    public class MyStepperRenderer : ViewRenderer<Stepper, LinearLayout>
    {
        AButton _downButton;
        AButton _upButton;

        public MyStepperRenderer()
        {
            AutoPackage = false;
        }

        protected override LinearLayout CreateNativeControl()
        {
            return new LinearLayout(Context) {

                Orientation = Orientation.Horizontal
            };
        }

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

            if (e.OldElement == null)
            {
                _downButton = new AButton(Context) { Text = "-", Gravity = GravityFlags.Center, Tag = this };
                //Set the MinWidth of Button
                _downButton.SetMinWidth(50);

                _downButton.SetOnClickListener(StepperListener.Instance);

                _upButton = new AButton(Context) { Text = "+", Tag = this };
                _upButton.SetOnClickListener(StepperListener.Instance);
                //Set the MinWidth of Button
                _upButton.SetMinWidth(50);

                if (e.NewElement != null)
                {
                    //Set the Width and Height of the button according to the WidthRequest
                    _downButton.LayoutParameters = new LayoutParams((int)e.NewElement.WidthRequest, LayoutParams.MatchParent);
                    _upButton.LayoutParameters = new LayoutParams((int)e.NewElement.WidthRequest, LayoutParams.MatchParent);
                }

                var layout = CreateNativeControl();

                layout.AddView(_downButton);
                layout.AddView(_upButton);

                SetNativeControl(layout);
            }

            UpdateButtonEnabled();
        }

        protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            base.OnElementPropertyChanged(sender, e);

            switch (e.PropertyName)
            {
                case "Minimum":
                    UpdateButtonEnabled();
                    break;
               case "Maximum":
                    UpdateButtonEnabled();
                    break;
                case "Value":
                    UpdateButtonEnabled();
                    break;
                case "IsEnabled":
                    UpdateButtonEnabled();
                    break;
            }
        }

        void UpdateButtonEnabled()
        {
            Stepper view = Element;
            _upButton.Enabled = view.IsEnabled ? view.Value < view.Maximum : view.IsEnabled;
            _downButton.Enabled = view.IsEnabled ? view.Value > view.Minimum : view.IsEnabled;
        }

        class StepperListener : Java.Lang.Object, IOnClickListener
        {
            public static readonly StepperListener Instance = new StepperListener();

            public void OnClick(global::Android.Views.View v)
            {
                var renderer = v.Tag as MyStepperRenderer;
                if (renderer == null)
                    return;

                Stepper stepper = renderer.Element;
                if (stepper == null)
                    return;

                if (v == renderer._upButton)
                    ((IElementController)stepper).SetValueFromRenderer(Stepper.ValueProperty, stepper.Value + stepper.Increment);
                else if (v == renderer._downButton)
                    ((IElementController)stepper).SetValueFromRenderer(Stepper.ValueProperty, stepper.Value - stepper.Increment);
        }
    }
}

然后就可以按照 CustomRenderer Tutorial 使用这个渲染器了.

步进按钮的宽度将正确改变:

enter image description here

关于xamarin.forms - Xamarin Forms Android 中步进器宽度无法正确调整大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45630864/

相关文章:

javascript - 动态更改 jQuery 可调整大小的处理程序

c# - Xamarin Forms ListView 数据绑定(bind)嵌套对象

user-interface - 如何在 xamarin 表单中创建与给定 UX 相同的 UI?

c# - Xamarin 形成 MVVM Stacklayout 内容绑定(bind)

visual-studio - 创建一个针对 Monodroid 的 PCL

css - 网格布局具有不同大小的网格列

ios - IOS标签标题,顶部没有图标空白

xamarin - 引用netstandard库时,项目中不存在目标 "GetBuiltProjectOutputRecursive"

c# - Xamarin.Android wav 到 m4a

jQuery resizable() 对象不会缩回