В 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); }
}
}