UWP CustomRenderer for Checkbox:指针在复选框更改样式?

Posted

技术标签:

【中文标题】UWP CustomRenderer for Checkbox:指针在复选框更改样式?【英文标题】:UWP CustomRenderer for Checkbox: Pointer over Checkbox changes style? 【发布时间】:2017-04-22 08:36:04 【问题描述】:

我正在使用 Xamarin.Forms,并为 UWP 中的复选框制作了 CustomRenderer。当我通过单击“Alle”按钮将我在ListView 中的项目的所有复选框设置为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);

我试图覆盖nativeCheckboxPointerEntered 事件。它可以工作,例如,如果我在此事件上将 model.IsChecked 设置为 true,它将被设置为 true:

nativeCheckbox.PointerEntered += (s, args) =>

    model.IsChecked = true;
;

但我不知道如何(即使在这个地方)在将光标移动到复选框上方时阻止复选框更改其外观。像这样用空代码留下触发事件不会改变所描述行为的任何内容:

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

当我将光标移到复选框上时,如何防止复选框改变其外观?

更新:

我为此问题创建了一个示例项目。你可以在这里找到存储库:https://github.com/Zure1/CustomCheckbox

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

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

信息:我正在我的桌面上进行调试 (Windows 10)。我不知道 WinPhone 是否存在这个问题。以防您想知道为什么我的复选框是红色的:我在 Windows 中的系统颜色是红色。

【问题讨论】:

【参考方案1】:

这是一个棘手的问题,因为我一直在努力解决这个问题,我会尽力回答这个问题。

TL;DR:这是由 ViewCell 引起的。

问题归结为 Xamarin Forms ListView 和 ViewCell。

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

我对可能原因的有根据的猜测是 ViewCell 的渲染代码丢失了一些东西。

至于您的特定问题,我创建了一个 CheckBoxCell,您可以使用它来显示带有标题的复选框列表。 I forked your project and made the changes.

这将显示类似于您想要实现的内容并且没有呈现问题,因此将是一个很好的起点。您可以自定义它以显示图像等,但您必须在特定于平台的布局代码中执行此操作。

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

我希望这会有所帮助。

【讨论】:

以上是关于UWP CustomRenderer for Checkbox:指针在复选框更改样式?的主要内容,如果未能解决你的问题,请参考以下文章

[xamarin][uwp][custom renderer] 自定义渲染器 pcl 库未在发布模式下加载

入口圆角 - Xamarin 形成 UWP

Xamarin 表单 - 导航后 CustomRenderer 不工作

Xamarin Forms iOS CustomRenderer Entry PlaceHolder 和 Button Text Padding Bottom

UWP中使用Telerik UI For UWP

A simple in-process HTTP server for UWP