Xamarin Entry在切换IsPassword时将CursorPosition设置为零(Android)

46qrfjad  于 2023-09-28  发布在  Android
关注(0)|答案(1)|浏览(86)

我有一个条目,我正在使用作为密码。除此之外,我还添加了一个ImageButton,按住它可以简要显示密码。正如您所看到的,“IsPassword”绑定到按钮的“IsPressed”属性。我遇到的问题是,当我按下并释放按钮时,光标会重置到条目的开始位置。焦点在Entry上没有改变,至少我没有看到与焦点相关的属性改变事件。当用户正在输入密码并希望快速查看他们输入的内容时,这是没有帮助的。我希望光标保持其位置不变。
我尝试添加一个PropertyChanged处理程序来缓存当前位置并恢复它,事件序列使这变得困难,感觉很笨拙。是否有更好的解决方法?

<Entry
    Text="{Binding Password}" Keyboard="Plain" 
    IsPassword="{Binding Source={x:Reference previewPasswordButton},
                 Path=IsPressed, Converter={StaticResource boolInvertConverter}}">
</Entry>
wwtsj6pe

wwtsj6pe1#

我可以在表单中复制它。当IsPassword更改时,光标会移到第一个位置。
我分享了一个使用Custom Renderer的解决方法,包括以下步骤:

创建自定义入口控件

public class MyCustomEntry : Entry
{
    public MyCustomEntry()
    {
    }
}

使用自定义控件

  • xaml文件 *
<local:MyCustomEntry x:Name="myentry" 
       Text="{Binding Password}" Keyboard="Plain"        
    />
<ImageButton x:Name="previewPasswordButton"
            Pressed="previewPasswordButton_Pressed"
            Released="previewPasswordButton_Released" />
void previewPasswordButton_Released(System.Object sender, System.EventArgs e)
{
    MessagingCenter.Send<MainPage,bool>(this, "button",false);
}

void previewPasswordButton_Pressed(System.Object sender, System.EventArgs e)
{
    MessagingCenter.Send<MainPage,bool>(this, "button",true);
}

创建Android平台自定义渲染器

[assembly: ExportRenderer(typeof(MyCustomEntry), typeof(MyCustomEntryRenderer))]
namespace EntryIsPassword77045393.Droid
{
    public class MyCustomEntryRenderer: EntryRenderer
    {

        int cursor_position;
        public MyCustomEntryRenderer(Context context) : base(context)
        {
            MessagingCenter.Subscribe<MainPage, bool>(this, "button", (s, e) =>
            {
                if(e)
                {
                    cursor_position = Control.SelectionStart;
                    Control.TransformationMethod = null;        
                    Control.SetSelection(cursor_position);
                }
                else
                {
                    cursor_position = Control.SelectionStart;
                    Control.TransformationMethod = PasswordTransformationMethod.Instance;
                    Control.SetSelection(cursor_position);
                }
            });
        }

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

希望有帮助。

相关问题