【问题标题】:Image Opacity, turn of and on图像不透明度,打开和打开
【发布时间】:2018-08-16 16:54:47
【问题描述】:

我有五张图片,当您单击其中一张时,我希望那张完全不透明,而另一张只有一半,以显示它是选定的一张。

我正在使用 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;
                }
            }

【问题讨论】:

  • having trouble to getting it to work 告诉我们更多...
  • 对不起,它有效,但似乎是一种非常粗糙的方法。

标签: c# xaml xamarin mvvm xamarin.forms


【解决方案1】:

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

使用绑定到IsSelected MVVM 属性的DataTrigger 来设置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>

更新

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

只创建一个状态和严重性枚举并绑定到它可能会更好(知道您在 cmets 中描述的内容)。并通过手势命令设置状态和严重性。

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

【讨论】:

  • 是的!我实际上得到了 3 张状态图像和 5 张严重程度图像,所以这可能是一个更好的方法吗?所以我应该创建一个 imageviewmodel 类,但有点不确定。我将如何设置和取消设置 imageVM 中的选定属性?抱歉,对这个有点陌生
  • 所以这只是一个图像控件?有很多图片要更改?
  • 控制是什么意思?它是 xaml 部分、类还是?我刚刚获得了更多图像作为 xaml 部分,但具有不同的源名称。
  • @JsonDork 我的意思是,您的页面中有多少张图片?是只有一个 还是有很多
  • 一共有8个。 3 张状态图片和 5 张严重程度图片?
猜你喜欢
  • 1970-01-01
  • 2011-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-21
  • 2016-06-14
  • 2012-03-29
相关资源
最近更新 更多