Изменение прозрачности image с помощью binding?

261
02 января 2018, 12:45

В Xamarin приложении имеется следующая структура страницы: (к центру по содержанию) Frame - StackLayout - ScrollView -Grid с двумя строками и одним столбцом - и в первой строке элемент Image, а во второй метка - lable. Вот собственно код:

 InitializeComponent();
        Label lb = new Label { Text="pasta"};
      img = new Image {Source ="pasta.jpg" };
        Frame fr = new Frame { HeightRequest=250, WidthRequest=250  };
        StackLayout st = new StackLayout {HeightRequest=fr.HeightRequest , WidthRequest =fr.WidthRequest , Orientation=StackOrientation.Vertical };
        sc  = new ScrollView { WidthRequest=st.WidthRequest , HeightRequest = st.HeightRequest  };
        Grid gr = new Grid {
            RowDefinitions = { new RowDefinition { Height =new GridLength(sc.HeightRequest) }, new RowDefinition { Height = new GridLength(sc.HeightRequest) } } ,
            ColumnDefinitions = { new ColumnDefinition { Width = new GridLength(sc.WidthRequest)} }
        };
        gr.Children.Add(img,0,0);
        gr.Children.Add(lb, 0, 1);
        sc.Content = gr;
        sc.Scrolled += On_scroll;
        st.Children.Add(sc);
        fr.Content = st;
        this.Content = fr;

Теперь, что собственно требуется: необходимо, что бы при скролинге прозрачность изображения уменшалась. Для этого я обращаюсь к событию Scrolled

 sc.Scrolled += On_scroll;
 stp = new Stepper { Increment=0.5};
  img.BindingContext = Img_Pr;//привязываем Img_Pr к   img.BindingContext
private void On_scroll(object sender, ScrolledEventArgs e)
    {
        stp.ValueChanged += Scroll_Step_img; //вызываем обработку stepper
    }

что бы контролировать степень прозрачности - я использую Stepper - обработчик которого я и вызываю в обработчике события Scrolled. На объекта Stepper - stp - я вызываю событие ValueChanged и подписываю на него обработчик.

Для того что бы контролировать прозрачность изображения -т.к у него нет такого свойства, я решил создать BindableProperty

public  class Image_Property_Class : Xamarin.Forms.Image
{
    public static readonly BindableProperty transperentProperty = BindableProperty.Create("Transparent", typeof(Color), typeof(Xamarin.Forms.Image), new Color(255, 255, 255, 0));
    public Color Transparent
        {
        set { SetValue(transperentProperty,value); }
        get { return (Color)GetValue(transperentProperty); }
        }
  }

-для этого я создал класс исследующийся от класса Image и уже в нем создал BindableProperty. По идее через него я хочу менять значение альфа канала исходного изображения - делая его прозрачнее.

public static Image_Property_Class Img_Pr = new Image_Property_Class { };//объект привязки

В обработчике события ValueChanged объекта stp

public static void Scroll_Step_img(object sender, ValueChangedEventArgs e)
    {
        //настраиваем объект привязки
        Img_Pr.SetBinding(Image_Property_Class.transperentProperty, "img.BackgroundColor");
        //устанавливаем новое значение
        Img_Pr.Transparent = new Color(img.BackgroundColor.R, img.BackgroundColor.G, img.BackgroundColor.B, e.NewValue);
    }

я настраиваю привязку устанавливая зависимость и передавая собственно самому свойству Transperent - новое значение в виде аргумента события -e. Но при этом при скролинге изображение не становится прозрачнее. Вот еще раз полный код по-порядку:

 ScrollView sc;
   public static Image img;
    Stepper stp;
    public MainPage()
    {
        InitializeComponent();
        Label lb = new Label { Text="pasta"};
      img = new Image {Source ="pasta.jpg" };
        Frame fr = new Frame { HeightRequest=250, WidthRequest=250  };
        StackLayout st = new StackLayout {HeightRequest=fr.HeightRequest , WidthRequest =fr.WidthRequest , Orientation=StackOrientation.Vertical };
        sc  = new ScrollView { WidthRequest=st.WidthRequest , HeightRequest = st.HeightRequest  };
        Grid gr = new Grid {
            RowDefinitions = { new RowDefinition { Height =new GridLength(sc.HeightRequest) }, new RowDefinition { Height = new GridLength(sc.HeightRequest) } } ,
            ColumnDefinitions = { new ColumnDefinition { Width = new GridLength(sc.WidthRequest)} }
        };
        gr.Children.Add(img,0,0);
        gr.Children.Add(lb, 0, 1);
        sc.Content = gr;
        sc.Scrolled += On_scroll;
        st.Children.Add(sc);
        fr.Content = st;
        this.Content = fr;
       stp = new Stepper { Increment=0.5};
        img.BindingContext = Img_Pr;//привязываем Img_Pr к   img.BindingContext

    }
    public static Image_Property_Class Img_Pr = new Image_Property_Class { };//объект привязки

    private void On_scroll(object sender, ScrolledEventArgs e)
    {
        stp.ValueChanged += Scroll_Step_img; //вызываем обработку stepper
    }
    public static void Scroll_Step_img(object sender, ValueChangedEventArgs e)
    {
        //настраиваем объект привязки
        Img_Pr.SetBinding(Image_Property_Class.transperentProperty, "img.BackgroundColor");
        //устанавливаем новое значение
        Img_Pr.Transparent = new Color(img.BackgroundColor.R, img.BackgroundColor.G, img.BackgroundColor.B, e.NewValue);
    }
}

BindablePeoperty

public  class Image_Property_Class : Xamarin.Forms.Image
{
    public static readonly BindableProperty transperentProperty = BindableProperty.Create("Transparent", typeof(Color), typeof(Xamarin.Forms.Image), new Color(255, 255, 255, 0));
    public Color Transparent
        {
        set { SetValue(transperentProperty,value); }
        get { return (Color)GetValue(transperentProperty); }
        }
}
READ ALSO
Что использовать var или let

Что использовать var или let

Вот думаю что лучше использовать внутри функций, var или let?

459
jqplot динамическое изменение графика

jqplot динамическое изменение графика

В настоящий момент использую аналогию:

342
Почему возникает “code”: 403, “message”: «Insufficient Permission» при запросе event google calendar?

Почему возникает “code”: 403, “message”: «Insufficient Permission» при запросе event google calendar?

На клиенте(android) получаю AuthCode и отправляю на сервер где нужно использовать календарь, получаю токен но когда запрашиваю event то возникает ошибка?

303
Trim и пустой текст с пробелом (php)

Trim и пустой текст с пробелом (php)

Если поступит пустой текст, точнее с пробелом " ", как поведет себя с ним функция trim()?

296