Xamarin.forms 步进机宽度为';t在Xamarin窗体中正确调整大小

Xamarin.forms 步进机宽度为';t在Xamarin窗体中正确调整大小,xamarin.forms,xamarin.android,resizable,stepper,Xamarin.forms,Xamarin.android,Resizable,Stepper,我想在我的Xamarin表单项目中使用步进器,但在Android中它无法正确调整宽度。WithRequest根本不起作用,当我设置边距时,它只调整两个按钮中的一个,另一个按钮仍保持正常大小 这是我的密码: <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width=".3*"/> <ColumnDefinition Width=".5*"/> <ColumnDefi

我想在我的Xamarin表单项目中使用步进器,但在Android中它无法正确调整宽度。WithRequest根本不起作用,当我设置边距时,它只调整两个按钮中的一个,另一个按钮仍保持正常大小

这是我的密码:

<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>

...
...
我想在我的Xamarin表单项目中使用步进器,但在Android中它无法正确调整宽度。WithRequest根本不起作用,当我设置边距时,它只调整两个按钮中的一个,另一个按钮仍保持正常大小

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

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

[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);
        }
    }
}
[程序集:导出呈现程序(typeof(MyStepper)、typeof(mystepperrender))]
名称空间StepperDemo.Droid
{
公共类mystepperrender:ViewRenderer
{
AButton_向下按钮;
阿布顿·厄布顿;
公共mystepperrender()
{
自动包装=错误;
}
受保护的重写LinearLayout CreateNativeControl()
{
返回新的LinearLayout(上下文){
方向=方向。水平
};
}
受保护的覆盖无效OnElementChanged(ElementChangedEventArgs e)
{
基础。一个要素发生变化(e);
if(e.OldElement==null)
{
_downButton=newabutton(Context){Text=“-”,Gravity=GravityFlags.Center,Tag=this};
//设置按钮的最小宽度
_向下按钮。设置最小宽度(50);
_SetOnClickListener(StepperListener.Instance);
_upButton=newabutton(上下文){Text=“+”,Tag=this};
_SetOnClickListener(StepperListener.Instance);
//设置按钮的最小宽度
_向上按钮。设置最小宽度(50);
if(例如NewElement!=null)
{
//根据WidthRequest设置按钮的宽度和高度
_downButton.LayoutParameters=新的LayoutParams((int)e.NewElement.WidthRequest,LayoutParams.MatchParent);
_upButton.LayoutParameters=新的LayoutParams((int)e.NewElement.WidthRequest,LayoutParams.MatchParent);
}
var layout=CreateNativeControl();
layout.AddView(_down按钮);
layout.AddView(_upButton);
SetNativeControl(布局);
}
UpdateButtoneEnabled();
}
受保护的覆盖无效OnElementPropertyChanged(对象发送方,PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(发送方,e);
开关(如PropertyName)
{
“最低”情况:
UpdateButtoneEnabled();
打破
“最大”情况:
UpdateButtoneEnabled();
打破
案例“值”:
UpdateButtoneEnabled();
打破
案例“IsEnabled”:
UpdateButtoneEnabled();
打破
}
}
void updateButtoneEnabled()
{
步进视图=元素;
_upButton.Enabled=view.IsEnabled?view.Valueview.Minimum:view.IsEnabled;
}
类StepperListener:Java.Lang.Object,IOnClickListener
{
公共静态只读StepperListener实例=新StepperListener();
public void OnClick(全局::Android.Views.View v)
{
var renderer=v.标记为mystepperrender;
if(渲染器==null)
返回;
Stepper Stepper=renderer.Element;
如果(步进器==null)
返回;
if(v==渲染器。\u向上按钮)
((IElementController)stepper).SetValueFromRenderer(stepper.ValueProperty,stepper.Value+stepper.Increment);
else if(v==渲染器。\u下拉按钮)
((IElementController)stepper).SetValueFromRenderer(stepper.ValueProperty,stepper.Value-stepper.Increment);
}
}
}
然后,您可以根据需要使用此渲染器

步进按钮的宽度将适当改变: