2016-11-30 74 views
0

我有extendedentry和自定义渲染器类Xamarin形式触发不工作自定义渲染

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作品。

我错了什么?

编辑

从Xamarin.Forms的ExportRenderer排在我的渲染器类。

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

回答

0
  1. 你不必做的每一个事件的下方。你可以这样做只有一次

    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); 
    
  2. 你有Control.Click和Control.FocusChange相同的代码。您可能需要考虑以某种方式将它分开功能。 请记住,FocusChange也被称为丢失焦点时,所以你可能要检查

    if (evt.HasFocus) 
    
  3. 控制时,创造了OnFocusChangeListener设置为ExtendedEntryRenderer。但只要您调用Control.FocusChange + =它将更改为[email protected],并且显然会导致问题。

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