图像不透明度,打开和打开

时间:2018-03-08 10:54:45

标签: c# xaml xamarin mvvm xamarin.forms

我有五张图片,当你点击其中一张图片时,我希望那张图片获得完全不透明度,而另一张图片只获得一半,以显示它是所选图片。

我正在使用MVVM,并且通常想知道我是否采用正确的方式

我正在考虑将绑定到属性中的imagesource的名称传递给我。

myDf = (
    sc.parallelize([
        (34, 30, "2016-07-02 12:01:40", "2016-07-02 14:01:40"), (184, 32, "2016-07-03 12:21:23", "2016-07-07 12:01:40")
    ]).toDF(["itemid", "eventid", "startTime", "endTime"])
    .withColumn("startTime", col("startTime").cast("timestamp"))
)
myDf = myDf.withColumn("endTime", col("endTime").cast("timestamp"))
timeFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS"
timeFormat = (F.unix_timestamp('endTime', format=timeFormat) - F.unix_timestamp('startTime', format=timeFormat))
myDf = myDf.withColumn("Trip Duration", timeFormat)
myDf = myDf.withColumn("Day" , date_format('startTime', 'E'))
myDf.show()

稍后将字符串转换为状态的列表。

<StackLayout Grid.Row="3" Grid.Column="1" Orientation="Horizontal" Spacing="0">
                            <Image Source="{Binding StatusUnresolved}" HorizontalOptions="Center"
                                   VerticalOptions="Center" HeightRequest="40" Opacity="{Binding StatusUnresolvedOpacity}">
                                <Image.GestureRecognizers>
                                    <!--<TapGestureRecognizer Command="{Binding Source={x:Reference this}, Path=OnStatusTappedCommand}" CommandParameter="{Binding StatusUnresolved}" />-->
                                </Image.GestureRecognizers>
                            </Image>
                        </StackLayout>

不透明度属性

  public List<IssueStatusModel> PossibleStatusValues
        {
            get
            {
                var items = new List<IssueStatusModel>
                {
                    new IssueStatusModel("statusUnresolved.png", IssueStatus.Unresolved),
                    new IssueStatusModel("statusInProgress.png", IssueStatus.InProgress),
                    new IssueStatusModel("statusDone.png", IssueStatus.Done)
                };

                return items;
            }
        }

切换语句更改所有不透明度。

       public double StatusDoneOpacity
        {
            get { return statusDoneOpacity; }
            set
            {
                if (statusDoneOpacity != value)
                {
                    statusDoneOpacity = value;
                    NotifyPropertyChanged(nameof(StatusUnresolvedOpacity));
                }
            }
        }

        public string StatusDone
        {
            get { return "statusDone.png"; }
        }

public void OnStatusTapped(string fileName)
        {
                foreach (IssueStatusModel item in StatusValues)
                {
                    if (item.Name != fileName) continue;
                    Issue.Status = item.Status;
                    StatusChecker();
                    return;
                }
            }

    }

1 个答案:

答案 0 :(得分:2)

id攻击方式,如果您有多个图像,请创建ImageVm并封装任何特定于图像的实现细节,即枚举StateIsSelected通知属性。当然,如果您只有1张图片,这将变得非常简单,您不需要vms

如果需要更改图像源,请使用绑定到DataTrigger MVVM属性的IsSelected来设置Opacity和状态。显然,点击后您需要设置IsSelected属性并取消选择其他VMs

DataTrigger

IsSelected示例
<Image Grid.Column="2" Stretch="None">
    <Image.Style>
        <Style TargetType="{x:Type Image}">
            <Setter Property="Opacity" Value="0.5" />
            <Style.Triggers>
                <DataTrigger Value="True" Binding="{Binding IsSelected}">
                    <Setter Property="Opacity" Value="0.5"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Image.Style>
</Image>

<强>更新

您可以在枚举中使用触发器,并且可以使用点击识别器在主视图模式中触发命令。命令也可以带参数。

它可能更好(知道你在评论中描述的内容)只是使状态和严重性枚举并绑定它。并通过手势命令设置状态和严重性。

然后,您可以为每个图像创建一个触发器,以更改各种状态和严重性上每个图像的不透明度。