2017-08-11 45 views
0

我想在Xamarin Forms Project中使用步进器,但它不会在Android中正确调整宽度。 WithRequest不会在所有的工作,当我设置边距它只调整其中一个按钮,另一个仍然在它的正常大小。步进宽度不会在Xamarin表格中正确调整大小Android

image1

这里是我的代码:

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

回答

1

我想在我Xamarin使用步进窗体项目,但不会在Android的正常调整宽度。 WithRequest不会在所有的工作,当我设置边距它只调整其中一个按钮,另一个仍然在它的正常大小。

按钮的尺寸未根据WidthRequest属性设置。如果你想设置按钮的大小,你将不得不做出自己的步进控制。

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使用该渲染器。

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

enter image description here

相关问题