XAML 图像不透明度,关闭与打开

xzlaal3s  于 2022-12-07  发布在  其他
关注(0)|答案(1)|浏览(179)

我有五个图像,当你点击其中一个,我希望这一个得到完全不透明,而另一个只得到一半,以显示它是选定的一个。
我正在使用MVVM,通常会怀疑我的方法是否正确
我在考虑将绑定的图像源的名称传递到属性中。

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

    }

Switch语句更改所有不透明度。

private void StatusChecker()
            {
                switch (Issue.Status)
                {
                    case IssueStatus.Unresolved:
                        StatusUnresolvedOpacity = 1;
                        StatusInProgressOpacity = 0.5;
                        StatusDoneOpacity = 0.5;
                        StatusText = "Unresolved";
                        break;
                    case IssueStatus.InProgress:
                        StatusUnresolvedOpacity = 0.5;
                        StatusInProgressOpacity = 1;
                        StatusDoneOpacity = 0.5;
                        StatusText = "In Progress";
                        break;
                    case IssueStatus.Done:
                        StatusUnresolvedOpacity = 0.5;
                        StatusInProgressOpacity = 0.5;
                        statusDoneOpacity = 1;
                        StatusText = "Done";
                        break;
                }
            }
t3psigkw

t3psigkw1#

我的解决方法是,如果您有多个映像,创建一个ImageVm并封装任何映像特定的实现细节,即枚举StateIsSelected通知属性。
使用绑定到IsSelected MVVM属性的DataTrigger来设置Opacity,并说明是否需要更改映像源。显然,单击时,您需要设置IsSelected属性并取消选择其他VMs
IsSelectedDataTrigger示例

<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>

更新

你可以使用带有枚举的触发器,你可以使用tap识别器在你的主视图模态中触发命令。命令也可以带参数。
最好(知道您在评论中描述了什么)只创建一个State和Severity枚举并绑定到它,然后通过一个手势命令设置State和Severity。
然后,您可以为每个图像创建一个触发器,以更改每个图像在不同状态和严重性下的不透明度。

相关问题