【问题标题】:Stepper width won't resize properly in Xamarin Forms Android步进器宽度不会在 Xamarin Forms Android 中正确调整大小
【发布时间】:2017-08-11 08:51:18
【问题描述】:

我想在我的 Xamarin Forms 项目中使用步进器,但它不会在 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.forms xamarin.android resizable stepper


    【解决方案1】:

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

    按钮的大小不是根据WidthRequest 属性设置的。如果要设置按钮的大小,则必须制作自己的 Stepper Control。

    StepperRendererOnElementChange 方法的源代码进行一些更改,使其适用于您自己的自定义控件。以下是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使用这个渲染器了。

    并且步进按钮的宽度会正确改变:

    【讨论】:

      猜你喜欢
      • 2022-08-13
      • 1970-01-01
      • 2014-03-09
      • 2020-08-24
      • 2014-10-05
      • 1970-01-01
      • 2017-11-02
      • 2017-03-31
      • 1970-01-01
      相关资源
      最近更新 更多