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