如何在xamarin.UWP中的Viewcell项目选择上设置自己的颜色?

时间:2018-08-03 07:52:27

标签: listview xamarin xamarin.forms uwp xamarin.uwp

我正在创建包含列表视图的应用程序,当我尝试运行到iOSAndroid时,它可以与自定义渲染器一起正常使用,但是当我尝试在Windows上点击运行时,它显示为蓝色颜色我必须在项目拍子上设置透明色,我尝试制作自定义渲染器,但找不到解决方法。

谢谢。

2 个答案:

答案 0 :(得分:1)

对于uwp,您只需在uwp项目中的app.xaml文件中添加样式即可。只需将以下样式添加到app.xaml uwp一侧的ResourceDictionary中。

<Application.Resources>
 <ResourceDictionary>
  <ResourceDictionary.ThemeDictionaries>
    <ResourceDictionary x:Key="Light">
       <Color x:Key="SystemAccentColor">#FF0000</Color>
       <SolidColorBrush x:Key="SystemControlHighlightAltListAccentHighBrush" Color="{ThemeResource SystemAccentColor}" Opacity="0.9" />
       <SolidColorBrush x:Key="SystemControlHighlightAltListAccentLowBrush" Color="{ThemeResource SystemAccentColor}" Opacity="0.6" />
       <SolidColorBrush x:Key="SystemControlHighlightAltListAccentMediumBrush" Color="{ThemeResource SystemAccentColor}" Opacity="0.8" />
       <SolidColorBrush x:Key="SystemControlHighlightListAccentHighBrush" Color="{ThemeResource SystemAccentColor}" Opacity="0.9" />
       <SolidColorBrush x:Key="SystemControlHighlightListAccentLowBrush" Color="{ThemeResource SystemAccentColor}" Opacity="0.6" />
       <SolidColorBrush x:Key="SystemControlHighlightListAccentMediumBrush" Color="{ThemeResource SystemAccentColor}" Opacity="0.8" />
    </ResourceDictionary>
  </ResourceDictionary.ThemeDictionaries>
 </ResourceDictionary>
</Application.Resources>

答案 1 :(得分:1)

在这种情况下,您有两个选择。如果您不需要ListView来指示选定的项目,只需要知道已点击的项目,请将SelectionMode设置为None

<ListView SelectionMode="None" ...>

要知道已窃听了哪个项目,您现在可以使用ItemTapped事件,该事件将为您提供ItemTappedEventArgs.Item属性中数据绑定的项目。

如果要保留选择模式,但要修改所选ListView项目的颜色,也可以这样做。

检查文档中ListView控件的默认样式和模板。您可以看到,默认情况下,颜色在ListViewItemPresenter.SelectedBackground中设置为{ThemeResource SystemControlHighlightListAccentLowBrush}。该笔刷实际上是基于当前用户的系统强调色的系统范围的笔刷,但是您可以覆盖-仅针对特定的ListView或整个应用程序。

如果要覆盖整个应用程序,请在UWP项目头内的Brush中的应用程序资源级别上声明一个App.xaml

<Application.Resources>
    <SolidColorBrush Color="Red" x:Key="SystemControlHighlightListAccentLowBrush" />
</Application.Resources>

对于控件特定的替代,请创建自定义渲染器和自定义样式。

首先在共享项目中使用控件:

public class SelectionColorListView : ListView
{
    public static readonly BindableProperty SelectionColorProperty =
        BindableProperty.Create(nameof(SelectionColor), typeof(Color), typeof(SelectionColorListView), Color.Green);

    public Color SelectionColor
    {
        get => (Color) GetValue(SelectionColorProperty);
        set => SetValue(SelectionColorProperty, value);
    }
}

然后是UWP的渲染器:

[assembly: ExportRenderer(typeof(SelectionColorListView), typeof(SelectionColorListViewRenderer))]

namespace App.UWP
{
    public class SelectionColorListViewRenderer : ListViewRenderer
    {
        protected override void OnElementChanged(ElementChangedEventArgs<ListView> e)
        {
            base.OnElementChanged(e);
            if (e.NewElement != null)
            {
                UpdateSelectionColor();
            }
        }

        protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            base.OnElementPropertyChanged(sender, e);
            if (e.PropertyName == nameof(SelectionColorListView.SelectionColor))
            {
                UpdateSelectionColor();
            }
        }

        private void UpdateSelectionColor()
        {
            if (Control != null && Element is SelectionColorListView listView)
            {
                var nativeColor = XamarinColorToNative(listView.SelectionColor);
                Control.Resources["SystemControlHighlightListAccentLowBrush"] = new SolidColorBrush(nativeColor);
            }
        }

        private Color XamarinColorToNative(Xamarin.Forms.Color color)
        {
            var alpha = (byte)(color.A * 255);
            var red = (byte)(color.R * 255);
            var green = (byte)(color.G * 255);
            var blue = (byte)(color.B * 255);
            return Color.FromArgb(alpha, red, green, blue);
        }
    }
}

请注意,不幸的是,颜色无法在运行时更改-首次选择后,即使更改属性值,颜色也将保持不变。

最后,如果只希望颜色是“透明的”,请使用Color.Transparent作为SelectionColor