如何在 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 【问题描述】:我正在创建包含列表视图的应用程序,当我尝试运行到 ios
和 android
时,它可以与自定义渲染器一起正常工作,但是当我尝试在 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.SelectedBackground
到ThemeResource 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 应用程序崩溃