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

Posted

技术标签:

【中文标题】如何在 xamarin.UWP 中的 Viewcell 项目选择上设置自己的颜色?【英文标题】:How to set own color on Viewcell Item selection in xamarin.UWP? 【发布时间】:2019-01-11 01:28:42 【问题描述】:

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

提前致谢。

【问题讨论】:

【参考方案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>

【讨论】:

我听不懂你能不能请你提供整个 App.Xaml 文件示例的示例 我已经更新了代码。只需在 uwp 的 app.xaml 文件中添加应用程序资源。【参考方案2】:

在这种情况下,您有两种选择。如果你不需要ListView来表示选中的项目,只需要知道哪些被点击了,将SelectionMode设置为None

<ListView SelectionMode="None" ...>

现在可以使用ItemTapped 事件了解哪个项目已被点击,该事件将为您提供ItemTappedEventArgs.Item 属性中的数据绑定项目。

如果你想保持选择模式但想修改选中的ListView项目的颜色,你也可以这样做。

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

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

<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

【讨论】:

嗨 Martin 首先,我在列表视图中找不到任何SelectionMode 选项,您可以在 xamarin 控件中检查它吗 SelectionMode 绝对是ListView 的属性。我在我的 GitHub 上发布了一个示例解决方案 - github.com/MartinZikmund/blog-2018/tree/master/…

以上是关于如何在 xamarin.UWP 中的 Viewcell 项目选择上设置自己的颜色?的主要内容,如果未能解决你的问题,请参考以下文章

如何更改 Xamarin.UWP 中 TableView TableSection 中的 TextSize 和大小写

如何将上下文菜单添加到 xamarin UWP 应用程序中的列表项?

如何连接多个字符串以组成 xamarin UWP 中的 x:Name?

由于 Xamarin UWP 项目中的 Xamarin.CarouselView,UWP 应用程序崩溃

如何在 Visual Studio 2017 中执行 Xamarin.uwp

如何在 Xamarin.UWP 应用程序中实现 LongPress?