Xamarin.Form.Android EntryRenderer.OnFocusChanged从未调用过

时间:2017-09-04 11:14:21

标签: c# xamarin.android xamarin.forms

这是我的问题:

我创建了一个源自EntryRenderer的WEntryRenderer。我的问题很简单,我已经从EntryRenderer覆盖了OnFocusChanged方法,因为我想在出现问题时停止焦点传播。问题是这个方法永远不会被调用..我不明白为什么,是否有人为我提供了这个方法?

/// <summary>
/// Renderer Android pour le contrôl WEntry
/// </summary>
public class WEntryRenderer : EntryRenderer
{
    protected override void OnFocusChanged(bool gainFocus, [GeneratedEnum] FocusSearchDirection direction, Rect previouslyFocusedRect)
    {
        bool dontSetFocus = false;

        //if (Something goes wrong)
        //{
        //    dontSetFocus = true;
        //}

        if (!dontSetFocus)
        {
            base.OnFocusChanged(gainFocus, direction, previouslyFocusedRect);
        }
    }

}

以下是另一种解决方案:

//分支事件

    private void SubscribeEvents()
    {
        //Emit au changement de focus
        this.Control.FocusChange += WEntryRenderer_FocusChanged;
    }

//代码相关

    private void WEntryRenderer_FocusChanged(object sender, FocusChangeEventArgs e)
    {
        //Si on perd le focus, on emet l'événement PropertyValidated de la propriété lié au composant
        if (!e.HasFocus && wentryRequiringFocus == null)
        {
            //Emet l'événementValidated
            this.currentWEntry.ModelPropertyBinding.OnPropertyValidated();

            //Si le composant possède des erreur et qu'aucune requête de focus n'est en cours, le composant requiert le focus
            if (!ListManager.IsNullOrEmpty(this.currentWEntry.ErrorList))
            {
                //Place le focus sur le control courant
                this.currentWEntry.Focus();

                //On indique à la classe que le focus est demandé par cette instance
                WEntryRenderer.wentryRequiringFocus = this.currentWEntry;
            }
        }
        //Si le focus a été demandé  par l'instance courante, on libère la demande à la récupération du focus
        else if (e.HasFocus && WEntryRenderer.wentryRequiringFocus == this.currentWEntry)
        {
            //Libère la requête de focus
            WEntryRenderer.wentryRequiringFocus = null;
        }
    }

我不喜欢这个解决方案导致即使你强调对实际实例的关注,焦点已经设置为另一个视图......它在ListView中导致了很多问题

1 个答案:

答案 0 :(得分:0)

您是否使用正确的装配属性装饰它?

method(int number, ArrayList<int> listOfPrimes)
{
    int x = 0;
    for (int i : listOfPrimes)
    {
        while(number%i == 0){
            number /= i;
            x++;
        }

    }
    return x;
 }

需要指示Xamarin Forms需要为指定为第一个参数的类型([assembly: ExportRenderer (typeof (Entry), typeof (WEntryRenderer))] namespace YourProject.iOS { ... } )调用此渲染器。

<强>更新

另一种解决方案可以尝试检查Entry OnElementPropertyChanged属性:

IsFocused