我正在尝试为我的Picker控件使用一个自定义渲染器。我还需要我的Picker在我打开一个选项卡时启动。我通过在选项卡SelectionChanged上调用Picker的Focus()
方法来实现这一点。
if (e.NewPosition == 1)
{
myPicker.Focus();
}
然而,这会同时触发两个选择器警报示例;一个是 * 默认渲染器 *,第二个是 * 我的自定义渲染器 *。2它们一个在另一个的上面,这样当我关闭带有 * 我的自定义渲染器 * 的渲染器时,带有 * 默认渲染器 * 的渲染器是可见的。
只需点击"选取器"将仅显示一个示例,带有自定义渲染器(这按预期工作)。
我按照this post's answer编写了我的自定义渲染器。
我尝试了here描述的答案,但问题是这跳过了picker的第二个示例,这不是我需要的,我需要保留具有我的自定义呈现器的示例,而不是具有默认呈现器的示例。
我还尝试确保运行在正确的线程上,实现this question's answers中描述的代码。
而且,我试图以某种方式从CustomRenderer中删除事件并再次添加它们,如下所示:
protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.Picker> e)
{
base.OnElementChanged(e);
Control.Click += null; // hoping this would override all existing events
Control.Click += Control_Click;
}
最后,this question最接近我的情况,我尝试遵循答案中描述的解决方案。
我相信当Focus()
被调用时,由于我的自定义渲染器继承了默认的PickerRenderer
,默认的渲染器会首先显示出来。
如何强制使用自定义渲染器?
或者有没有一种不同的方法可以让我在更改选项卡时启动选择器,而不是调用Focus()
?
我的项目运行在Xamarin.forms5.0.0.2545(我写这个问题时的最新版本)上。
编辑
我观察到以下行为:Control.Click
事件在默认渲染器显示后被触发。通过调试应用并在Control.Click
处理函数中放置断点,我可以看到应用首先打开默认选取器,然后在所述断点处停止。
1条答案
按热度按时间w8rqjzmb1#
已解决
通过研究
PickerRenderer.cs
类,我意识到有更多的函数需要重写。开始,我让我的自定义呈现器类实现
IPickerRenderer
接口,并添加了以下函数:此外,我重写了
CallOnClick()
函数:最后,我添加了这段代码(多亏了this answer)来确保Picker只出现一次,这样,我的
OnElementChanged
函数看起来就像这样:结论是所描述的行为
不管怎样,我都解决了我的问题。
如果还有人偶然发现这一点,我希望我的工作能有所帮助。