首页 文章

Xamarin表单触发器不工作自定义渲染器

提问于
浏览
0

我有extendedentry和自定义渲染器类

public class ExtendedEntryRenderer : EntryRenderer
{
    protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
    {
        base.OnElementChanged(e);

        if (Control != null)
        {
            Control.Click += (sender, evt) =>
            {
                var nativeEditText = (global::Android.Widget.EditText)Control;
                nativeEditText.SetSelectAllOnFocus(true);

                new Handler().PostDelayed(delegate
                {
                     Control.InputType = 0;
                     try
                     {
                         InputMethodManager inputMethodManager = Control.Context.GetSystemService(Android.Content.Context.InputMethodService) as InputMethodManager;
                         if (inputMethodManager != null)
                         {
                             inputMethodManager.HideSoftInputFromWindow(Control.WindowToken, HideSoftInputFlags.None);
                         }
                     }
                     catch (Exception Ex)
                     {

                     }
                 }, 300L);
            };


            // Hide soft input keyboard
            Control.FocusChange += (sender, evt) =>
            {
                // Select all on entry focus
                var nativeEditText = (global::Android.Widget.EditText)Control;

                nativeEditText.SetSelectAllOnFocus(true);

                new Handler().PostDelayed(delegate
                 {
                     Control.InputType = 0;
                     try
                     {
                         InputMethodManager inputMethodManager = Control.Context.GetSystemService(Android.Content.Context.InputMethodService) as InputMethodManager;
                         if (inputMethodManager != null)
                         {
                            inputMethodManager.HideSoftInputFromWindow(Control.WindowToken, HideSoftInputFlags.None);
                         }
                     }
                     catch (Exception Ex)
                     {

                     }
                 }, 300L);
            };
        }
    }
}

我的自定义条目:

public class ExtendedEntry : Entry
{

}

我的XAML文件是这样的:

<local:ExtendedEntry x:Name="BarcodeEntry" Text="{Binding Barcode}" Margin="0,0,0,0" HorizontalOptions="FillAndExpand" VerticalOptions="Start">
    <Entry.Triggers>
        <Trigger TargetType="Entry" Property="IsFocused" Value="True">
            <Setter Property="BackgroundColor" Value="Yellow" />
            <Setter Property="TextColor" Value="Black" />
        </Trigger>
    </Entry.Triggers>       
</local:ExtendedEntry>

Trigger 不起作用 .

但是,当我更改为默认输入控件时,如下所示:

<Entry x:Name="BarcodeEntry" Text="{Binding Barcode}" Margin="0,0,0,0"HorizontalOptions="FillAndExpand" VerticalOptions="Start">
    <Entry.Triggers>
        <Trigger TargetType="Entry" Property="IsFocused" Value="True">
            <Setter Property="BackgroundColor" Value="Yellow" />
            <Setter Property="TextColor" Value="Black" />
        </Trigger>
    </Entry.Triggers>       
</Entry>

Trigger 有效 .

我错了什么?

Edit

来自Xamarin.Forms的 ExportRenderer 行在我的渲染器类中 .

[assembly: ExportRenderer(typeof(ExtendedEntry), typeof(ExtendedEntryRenderer))]

1 回答

  • 0
    • 您不必在每个活动下面做 . 你只能这样做一次
    protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
    {
        base.OnElementChanged(e);
    
        if (e.NewElement != null)
        {
            var nativeEditText = (global::Android.Widget.EditText)Control;
            // Select all on entry focus
            nativeEditText.SetSelectAllOnFocus(true);
    
    • 在Control.Click和Control.FocusChange中有相同的代码 . 您可能想以某种方式考虑将其分离功能 . 请记住,焦点丢失时也会调用FocusChange,因此您可能需要检查
    if (evt.HasFocus)
    
    • 创建Control时,其OnFocusChangeListener设置为ExtendedEntryRenderer . 但是一旦你调用Control.FocusChange =它就会改为mono.android.view.View_OnFocusChangeListenerImplementor@a25f36e并且显然会导致问题 .

    Commment out Control.FocusChange它会工作 . 当用户将焦点设置到您的Entry时,您将获得足够的Click事件 . 如果需要,你不会知道何时失去焦点 .

相关问题