Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何控制图像并在listview中创建动画?_C#_Xamarin_Xamarin.forms - Fatal编程技术网

C# 如何控制图像并在listview中创建动画?

C# 如何控制图像并在listview中创建动画?,c#,xamarin,xamarin.forms,C#,Xamarin,Xamarin.forms,我目前正在使用一个收集图像的列表视图。我做得很成功,但我现在想给它添加一个动画。我首先让图像的不透明度完全为0,然后我希望用.FadeTo(11000,Easing.SinIn)来增加它一旦收集了图像 因为我使用的是listview,所以我不能使用x:name,所以我不知道如何使用listview解决这个问题 这是我当前的代码: <ListView x:Name="listview" > <ListView.ItemTemplate>

我目前正在使用一个收集图像的列表视图。我做得很成功,但我现在想给它添加一个动画。我首先让图像的不透明度完全为0,然后我希望用
.FadeTo(11000,Easing.SinIn)来增加它一旦收集了图像

因为我使用的是listview,所以我不能使用x:name,所以我不知道如何使用listview解决这个问题

这是我当前的代码:

<ListView x:Name="listview" >
        <ListView.ItemTemplate>
            <DataTemplate>
                <ViewCell>
                    <ViewCell.View>
                        <AbsoluteLayout>

                          <Image Source = "{Binding image}" Opacity = "{Binding animation}"/>

                        </AbsoluteLayout>
                    </ViewCell.View>
                </ViewCell>
            </DataTemplate>
        </ListView.ItemTemplate>
 </ListView>
将图像添加到列表时:

myList.add (new info()
{
       image = theitems["image"].ToString(),
       isImageShowing = true
});

代码运行并显示图像,但我看不到动画。在日志中,当我收集3张图像时,我得到了3次“设置”。完成此操作的最后一部分是将xaml中的
公共字符串图像{get;set;}
/my
连接到
CustomImage
,如果我没有弄错的话,但我不确定如何实现这一点

因为需要在
图像上执行动画,所以我建议在
图像
类的扩展上定义动画

我还建议您在扩展上创建一个可绑定属性,以通过动画切换可见性

像下面这样

public class CustomImage : Image
{
    public static readonly BindableProperty IsImageShowingProperty = BindableProperty.Create("IsImageShowing", typeof(bool), typeof(CustomImage), false, BindingMode.Default, propertyChanged: OnImageShowingChanged);

    private static void OnImageShowingChanged(BindableObject bindable, object oldValue, object newValue)
    {
        if(newValue == null) return;

        var img = (CustomImage)bindable;
        var b = (bool)newValue;

        if(b)
        {
            img.ShowImage();
        }
        else
        {
            img.HideImage();
        }
    }

    public bool IsImageShowing
    {
        get {  return (bool)GetValue(IsImageShowingProperty); }
        set { SetValue(IsImageShowingProperty, value); }
    }

    public void ShowImage()
    {
        this.FadeTo(1, 1000, Easing.SinIn);
    }

    public void HideImage()
    {
        this.FadeTo(0, easing: Easing.SinIn);
    }
}
现在,在
Info
类中,不要使用
Animation
integer属性,而是创建一个bool属性来切换图像动画并将其绑定到
IsImageShowingProperty
。将数据添加到
列表视图.ItemsSource
后,检查并切换每个项目的布尔属性,它将运行动画

还要确保在
Info
类上实现
INotifyPropertyChanged

更新: 如果需要在加载数据时运行动画,请将其添加到
CustomImage
类中

protected override void OnBindingContextChanged()
{
    base.OnBindingContextChanged();
    if(IsImageShowing)
    {
        this.ShowImage();
    }
}

另外,在初始化自定义图像时,请确保将图像不透明度设置为0,否则您将看不到淡入效果

非常感谢您的回答!我会马上检查并测试它,以便更接近解决这个问题。将在几分钟后更新帖子以显示我的进度。我现在更新了帖子,尝试使用您的CustomImage代码解决此问题。我如何将字符串图像连接到CustomImage/我在xaml中拥有的图像?我认为这一切都正常,但正如您在
CustomImage
类中看到的那样,
IsImageShowing
时会出现动画属性更改。因此,如果您最初将info类上的
isImageShowing
属性设置为false。然后通过并切换为true,您将看到动画运行。
public class CustomImage : Image
{
    public static readonly BindableProperty IsImageShowingProperty = BindableProperty.Create("IsImageShowing", typeof(bool), typeof(CustomImage), false, BindingMode.Default, propertyChanged: OnImageShowingChanged);

    private static void OnImageShowingChanged(BindableObject bindable, object oldValue, object newValue)
    {
        if(newValue == null) return;

        var img = (CustomImage)bindable;
        var b = (bool)newValue;

        if(b)
        {
            img.ShowImage();
        }
        else
        {
            img.HideImage();
        }
    }

    public bool IsImageShowing
    {
        get {  return (bool)GetValue(IsImageShowingProperty); }
        set { SetValue(IsImageShowingProperty, value); }
    }

    public void ShowImage()
    {
        this.FadeTo(1, 1000, Easing.SinIn);
    }

    public void HideImage()
    {
        this.FadeTo(0, easing: Easing.SinIn);
    }
}
protected override void OnBindingContextChanged()
{
    base.OnBindingContextChanged();
    if(IsImageShowing)
    {
        this.ShowImage();
    }
}