UWP CustomRenderer for Checkbox:Checkbox上的指针改变了样式?

时间:2016-12-07 11:56:11

标签: c# checkbox xamarin.forms custom-controls

我正在使用Xamarin.Forms,我在UWP中为Checkbox创建了一个CustomRenderer。当我通过点击按钮" Alle"将我的项目的所有复选框设置在ListViewtrue时,复选框会正确显示,并且框内有支票:

enter image description here

但是,如果我将鼠标悬停在复选框上,它们会立即改变它们的外观(检查消失但仍然选中)。在下面的屏幕截图中,我将光标移到第3到第7个复选框上:

enter image description here

这是我在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);
}

我试图覆盖PointerEntered的{​​{1}}事件。它可以工作,例如,如果我在此事件上将model.IsChecked设置为true,则将其设置为true:

nativeCheckbox

但我不知道如何(如果在这个地方)阻止复选框在将复选框上方的光标移动时更改它的外观。只是将触发事件留下这样的空代码就不会改变所描述的行为:

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

当我将光标移到它上面时,如何阻止Checkbox更改它的外观?

更新

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

它具有完全相同的描述行为。在下面的屏幕截图中,我按了按钮&#34; All&#34;在屏幕的底部,然后复选框看起来正确,并在其中检查:

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

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

1 个答案:

答案 0 :(得分:2)

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

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

问题归结为Xamarin Forms ListView和ViewCell。

我几个月来一直无法找到原因,我解决这个问题的方法是每次更改时刷新ListView,强制重写整个ListView,这可能会影响性能。< / p>

我根深蒂固地猜测原因可能是ViewCell的渲染代码遗漏了什么。

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

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

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

我希望这会有所帮助。

CheckBoxCell list