我正在使用Xamarin.Forms,我在UWP中为Checkbox创建了一个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);
}
我试图覆盖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中的系统颜色是红色。
答案 0 :(得分:2)
这是一个棘手的问题,因为我一直在努力解决这个问题,我会尽力回答这个问题。
TL; DR:它是由ViewCell引起的。
问题归结为Xamarin Forms ListView和ViewCell。
我几个月来一直无法找到原因,我解决这个问题的方法是每次更改时刷新ListView,强制重写整个ListView,这可能会影响性能。< / p>
我根深蒂固地猜测原因可能是ViewCell的渲染代码遗漏了什么。
至于您的特定问题,我创建了一个CheckBoxCell,您可以使用它来显示带有标题的复选框列表。 I forked your project and made the changes.
这将显示类似于您尝试实现的内容,并且没有渲染问题,因此将是一个很好的起点。您可以自定义此图像以显示图像等,但您必须在特定于平台的布局代码中执行此操作。
请注意,我只为UWP创建了代码,这应该足以让您使用其他平台。
我希望这会有所帮助。