C# UWP CustomRenderer for复选框:指针指向复选框更改样式?

C# UWP CustomRenderer for复选框:指针指向复选框更改样式?,c#,checkbox,xamarin.forms,custom-controls,C#,Checkbox,Xamarin.forms,Custom Controls,我正在使用Xamarin.Forms,我在UWP中为复选框制作了一个自定义呈现程序。当我通过单击按钮“Alle”将列表视图中我的项目的所有复选框设置为true时,复选框正确显示,复选框内有复选框: 但是,如果我将鼠标悬停在复选框上,它们会立即更改其外观(复选框消失,但仍处于选中状态)。在下面的屏幕截图中,我将光标移动到第3-7个复选框上: 这是我在CustomRenderer中重写的OnElementChanged方法: protected override void OnElementCh

我正在使用Xamarin.Forms,我在UWP中为复选框制作了一个自定义呈现程序。当我通过单击按钮“Alle”将
列表视图中我的项目的所有复选框设置为
true
时,复选框正确显示,复选框内有复选框:

但是,如果我将鼠标悬停在复选框上,它们会立即更改其外观(复选框消失,但仍处于选中状态)。在下面的屏幕截图中,我将光标移动到第3-7个复选框上:

这是我在CustomRenderer中重写的
OnElementChanged
方法:

protected override void OnElementChanged(ElementChangedEventArgs<EvaCheckbox> e)
{
    base.OnElementChanged(e);
    var model = e.NewElement;
    if (model == null)
    {
        return;
    }

    nativeCheckbox = new CheckBox();
    CheckboxPropertyChanged(model, null);
    model.PropertyChanged += OnElementPropertyChanged;

    nativeCheckbox.Checked += (object sender, Windows.UI.Xaml.RoutedEventArgs eargs) =>
    {
        model.IsChecked = (bool)nativeCheckbox.IsChecked;
    };

    nativeCheckbox.Unchecked += (object sender, Windows.UI.Xaml.RoutedEventArgs eargs) =>
    {
        model.IsChecked = (bool)nativeCheckbox.IsChecked;
    };

    SetNativeControl(nativeCheckbox);
}
但我不知道如何(即使在这个地方)防止复选框在移动光标到复选框上方时改变其外观。仅将触发的事件保留为空代码(如下所示)不会改变所描述的行为:

nativeCheckbox.PointerEntered += (s, args) => { };
当我将光标移到复选框上时,如何防止复选框更改其外观

更新: 我已经为这个问题创建了一个示例项目。您可以在此处找到存储库:

它具有完全相同的描述行为。在下面的屏幕截图中,我按下了屏幕底部的“全部”按钮,然后复选框看起来像是正确的,里面有一个复选框:

将鼠标光标移动到底部3个复选框上后,它们的外观将发生变化:


信息:我正在桌面(Windows 10)上调试。我不知道WinPhone上是否存在此问题。万一你想知道为什么我的复选框是红色的:我在Windows中的系统颜色是红色的。

这是一个棘手的问题,因为我已经为这个问题挣扎了一段时间,我会尽力回答这个问题

TL;医生:这是由ViewCell引起的

问题归结到Xamarin表单ListView和ViewCell

我已经有好几个月没有找到原因了,解决这个问题的方法是每次发生更改时刷新ListView,强制重新绘制整个ListView,这会真正影响性能

我有根据地猜测原因可能是ViewCell的渲染代码缺少某些内容

对于您的特定问题,我创建了一个复选框单元格,您可以使用它显示带有标题的复选框列表

这将显示与您尝试实现的内容类似的内容,并且不会出现渲染问题,因此这将是一个很好的起点。您可以对其进行自定义以显示图像等,但必须在特定于平台的布局代码中执行此操作

请注意,我只为UWP创建了代码,这应该足以让您使用其他平台

我希望这能有所帮助

nativeCheckbox.PointerEntered += (s, args) => { };