xamarin 自定义选取器呈现程序错误-调用Picker.Focus()时,选取器显示两次

x3naxklr  于 2022-12-31  发布在  其他
关注(0)|答案(1)|浏览(113)

我正在尝试为我的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处理函数中放置断点,我可以看到应用首先打开默认选取器,然后在所述断点处停止。

w8rqjzmb

w8rqjzmb1#

已解决

通过研究PickerRenderer.cs类,我意识到有更多的函数需要重写。
开始,我让我的自定义呈现器类实现IPickerRenderer接口,并添加了以下函数:

void IPickerRenderer.OnClick()
{
    Control_Click(this, null); // this function handles the Control.Click event
}

此外,我重写了CallOnClick()函数:

public override bool CallOnClick()
{
    Control_Click(this, null); // same function, that handles the Control.Click event
    return true;
}

最后,我添加了这段代码(多亏了this answer)来确保Picker只出现一次,这样,我的OnElementChanged函数看起来就像这样:

protected override void OnElementChanged(ElementChangedEventArgs<Picker> e)
{
    base.OnElementChanged(e);

    if (Control != null)
    {
        Control.Focusable = false;
    }

    Control.Click += Control_Click; // this is where I link the handler to the event
}

结论是所描述的行为

  • 我不是一个bug,这意味着我只是没有正确地实现它
  • 我是一个bug,我设法找到了一个很好的解决方法

不管怎样,我都解决了我的问题。
如果还有人偶然发现这一点,我希望我的工作能有所帮助。

相关问题