Пользовательский степпер Xamarin Forms

Я пытаюсь создать собственный степпер для использования в моем представлении списка, например, этот  Пользовательский шаговый двигатель

есть идеи как это сделать? Спасибо.


person mohammad anouti    schedule 02.11.2018    source источник
comment
Что у вас уже есть? Это ваш скриншот? В чем именно проблема?   -  person Gerald Versluis    schedule 02.11.2018
comment
Это настраиваемый стек с 2 кнопками и 1 записью посередине, проблема в том, что мне нужно получить значение этой записи при изменении. Например, в обычном степпере я могу легко использовать метод ValueChanged и обрабатывать значение.   -  person mohammad anouti    schedule 02.11.2018
comment
Если это настраиваемый элемент управления, вам нужно будет добавить свои собственные события, чтобы страница могла подписаться на эти ...   -  person Depechie    schedule 02.11.2018
comment
Где именно ты застрял? Опубликуйте свою текущую реализацию.   -  person shanranm    schedule 04.11.2018
comment
Моя реализация - это ответ Йорка Шена. У меня такой же настраиваемый класс, я застрял в получении значения записи, чтобы использовать его в моем коде. В комментарии выше я привел пример того, что в обычном степпере вы можете легко использовать ValueChanged, но здесь я не знаю, как это сделать.   -  person mohammad anouti    schedule 05.11.2018
comment
Я использовал этот ответ: forum.xamarin.com/discussion/140026/stepper -in-xamarin-forms   -  person mohammad anouti    schedule 05.11.2018


Ответы (1)


Решение 1:

Stepper позволяет вводить дискретное значение, ограниченное диапазоном. Вы можете отобразить значение Stepper, используя привязку данных в метке, как показано ниже:

Определите в XAML:

<StackLayout x:Name="Container">
    <Label BindingContext="{x:Reference stepper}" Text="{Binding Value}" />
    <Stepper Minimum="0" Maximum="10" x:Name="stepper" Increment="0.5" />
</StackLayout>

Решение 2:

Вы можете создать BindableProperty для реализации этой функции, например:

public class CustomStepper : StackLayout
{
    Button PlusBtn;
    Button MinusBtn;
    Entry Entry;

    public static readonly BindableProperty TextProperty =
      BindableProperty.Create(
         propertyName: "Text",
          returnType: typeof(int),
          declaringType: typeof(CustomStepper),
          defaultValue: 1,
          defaultBindingMode: BindingMode.TwoWay);

    public int Text
    {
        get { return (int)GetValue(TextProperty); }
        set { SetValue(TextProperty, value); }
    }
    public CustomStepper()
    {
        PlusBtn = new Button { Text = "+", WidthRequest = 40, FontAttributes = FontAttributes.Bold, FontSize = 15 };
        MinusBtn = new Button { Text = "-", WidthRequest = 40, FontAttributes = FontAttributes.Bold, FontSize = 15 };
        switch (Device.RuntimePlatform)
        {

            case Device.UWP:
            case Device.Android:
                {
                    PlusBtn.BackgroundColor = Color.Transparent;
                    MinusBtn.BackgroundColor = Color.Transparent;
                    break;
                }
            case Device.iOS:
                {
                    PlusBtn.BackgroundColor = Color.DarkGray;
                    MinusBtn.BackgroundColor = Color.DarkGray;
                    break;
                }
        }

        Orientation = StackOrientation.Horizontal;
        PlusBtn.Clicked += PlusBtn_Clicked;
        MinusBtn.Clicked += MinusBtn_Clicked;
        Entry = new Entry
        {
            PlaceholderColor = Color.Gray,
            Keyboard = Keyboard.Numeric,
            WidthRequest = 40, BackgroundColor = Color.FromHex("#3FFF")
        };
        Entry.SetBinding(Entry.TextProperty, new Binding(nameof(Text), BindingMode.TwoWay, source: this));
        Entry.TextChanged += Entry_TextChanged;
        Children.Add(PlusBtn);
        Children.Add(Entry);
        Children.Add(MinusBtn);
    }

    private void Entry_TextChanged(object sender, TextChangedEventArgs e)
    {
        if (!string.IsNullOrEmpty(e.NewTextValue))
            this.Text = int.Parse(e.NewTextValue);
    }

    private void MinusBtn_Clicked(object sender, EventArgs e)
    {
        if (Text > 1)
            Text--;
    }

    private void PlusBtn_Clicked(object sender, EventArgs e)
    {
        Text++;
    }

}

Для получения более подробной информации обратитесь к следующим документам:

Обновлять:

В классе CustomStepper значение Entry связывается со свойством Text, поэтому вы можете получить значение записи через customStepper.Text.

Например:

<local:CustomStepper x:Name="MyCustomerStepper"/>

Вы можете получить его Entry значение в своем xaml.cs файле с помощью:

var yourCustomerStepperEntryValue = MyCustomerStepper.Text.ToString();
person Eren Shen    schedule 05.11.2018
comment
Это именно то, что я делаю, мне нужно получить это значение записи, чтобы использовать его в классе XAML.cs. - person mohammad anouti; 05.11.2018
comment
У вас есть какие-нибудь решения? - person mohammad anouti; 08.11.2018
comment
@mohammadanouti, вы можете получить его с помощью var yourStepperValue = stepper.Value;. - person Eren Shen; 08.11.2018
comment
Я хорошо знаю настраиваемые отрисовки и их использование в XAML и т. Д., Но проблема в том, что я не знаю, как реализовать его с нуля, поэтому, пожалуйста, поделитесь мне кодом, как в XAML можно использовать запись настраиваемого Stacklayout, который я создал, чтобы использовать его в файле Xaml.cs - person mohammad anouti; 12.11.2018
comment
ответьте, пожалуйста. заранее спасибо - person mohammad anouti; 14.11.2018
comment
@mohammadanouti, пожалуйста, расскажите немного подробнее о функции, которой вы хотите достичь? :) - person Eren Shen; 14.11.2018
comment
@mohammadanouti, я обновил свой ответ, проверьте его. - person Eren Shen; 14.11.2018
comment
Спасибо, это именно то, что вам нужно делать, когда вы обычно используете его на странице, но дело в том, что я использую его в представлении списка, и, как вы знаете, элементы в представлении списка не могут получить к нему прямой доступ. Обычный степпер в представлении списка вы можете получить к нему доступ с помощью метода ValueChanged и легко получить значение, используя e.NewValue в методе ValueChanged в файле Xaml.cs. Но в моем случае я не могу получить доступ к CustomStepper непосредственно из представления списка, поэтому есть ли способ получить значение текста, когда этот CustomStepper помещается в представление списка. Надеюсь, вы поняли мою мысль и помогли мне ее решить. - person mohammad anouti; 16.11.2018
comment
Я очень благодарен за вашу помощь и поддержку, но мне нужен ваш ответ как можно скорее. - person mohammad anouti; 19.11.2018
comment
@mohammadanouti, извините за мой поздний ответ, на ваш вопрос, я думаю, вы могли бы сослаться на это: stackoverflow.com/questions/53189391/ - person Eren Shen; 19.11.2018
comment
@mohammadanouti, я не тестировал на своей стороне, но думаю, что это одна и та же проблема - person Eren Shen; 19.11.2018
comment
Я пробовал раньше что-то подобное, я поместил TapGestureRecognizer, ClickedGestureRecognizer и SwipeGestureRecognizer для CustomStepper, так как это stacklayout, поэтому каждый раз, когда я меняю значение, оно будет сохраняться, но он не вводит ни одно из них при нажатии или нажатии на кнопки или запись :( - person mohammad anouti; 19.11.2018
comment
@mohammadanouti, я пока не придумал решения, если это срочно для вас, я предлагаю вам поднять новый вопрос в StackOverflow. Приносим извинения за неудобства - person Eren Shen; 19.11.2018
comment
Нет проблем, спасибо за вашу помощь. Хорошо, я сделаю - person mohammad anouti; 19.11.2018
comment
Спасибо за идею :) - person Hemant Ramphul; 02.11.2019