How to automatically select all text on focus in Entry,Editor,Label? Use Cross Platforms.
Quantity.IsFocused = true;
No work :(
How to automatically select all text on focus in Entry,Editor,Label? Use Cross Platforms.
Quantity.IsFocused = true;
No work :(
As mentioned in other answers, if you are using Xamarin Forms 4.2+, you can use the CursorPosition and SelectionLength properties. However, you need to make sure you invoke on the Main/UI thread as all direct manipulation of UI elements must be done there. The app will very likely crash when deployed to a device without doing so, even if it appears to run fine in a simulator.
XAML
<Entry x:Name="MyEntry" Focused="MyEntry_Focused" />
C#
private void MyEntry_Focused(object sender, FocusEventArgs e)
{
Dispatcher.BeginInvokeOnMainThread(() =>
{
MyEntry.CursorPosition = 0;
MyEntry.SelectionLength = MyEntry.Text != null ? MyEntry.Text.Length : 0
});
}
For Xamarin.Forms, you can also use Device.BeginInvokeOnMainThread() rather than Dispatcher. If you're using Xamarin Essentials, there is also MainThread.BeginInvokeOnMainThread() (which does the same as Device.BeginInvokeOnMainThread()).
Xamarin.Forms has a method called Device.BeginInvokeOnMainThread(Action) that does the same thing as MainThread.BeginInvokeOnMainThread(Action). While you can use either method in a Xamarin.Forms app, consider whether or not the calling code has any other need for a dependency on Xamarin.Forms. If not, MainThread.BeginInvokeOnMainThread(Action) is likely a better option.
1.Add Focused Event.Cs
protected void Txt_Focussed(object sender, FocusEventArgs e)
{
txt.CursorPosition = 0;
txt.SelectionLength = txt.Text.Length;
}
Set focus
protected override void OnAppearing()
{
base.OnAppearing();
txt.Focus();
}
XAML Code
<Entry x:Name="txt" Text="155134343" Focused="Txt_Focussed" />
In MainActivity add
public class MyEntryRenderer : EntryRenderer
{
public MyEntryRenderer(Context ctx) : base(ctx) {}
protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
{
base.OnElementChanged(e);
if (e.OldElement == null)
{
var nativeEditText = (EditText)Control;
nativeEditText.SetSelectAllOnFocus(true);
}
}
}
and to the top add :
[assembly: ExportRenderer (typeof (Entry), typeof (MyEntryRenderer))]
In my case, to make work @SAIJAN KP answer, i made the Focused
handler async
and awaited a small delay to wait the cursor to appear on Entry
:
private async void Entry_Focused(object sender, FocusEventArgs e)
{
await Task.Delay(100);
entryTest.CursorPosition = x;
entryTest.SelectionLength = y;
}
XAML
<Entry x:Name="entryTest" Text="155134343" Focused="Entry_Focused" />
@kiddailey posted a nice solution, here is a reusable solution based on that:
Create behavior in code behind
public class SelectContentWhenFocusedBehavior : Behavior<Entry>
{
protected override void OnAttachedTo(Entry entry)
{
entry.Focused += OnFocused;
base.OnAttachedTo(entry);
}
protected override void OnDetachingFrom(Entry entry)
{
entry.Focused -= OnFocused;
base.OnDetachingFrom(entry);
}
private static void OnFocused(object sender, FocusEventArgs args)
{
Device.BeginInvokeOnMainThread(() =>
{
Entry myEntry = sender as Entry;
myEntry.CursorPosition = 0;
myEntry.SelectionLength = myEntry.Text != null ? myEntry.Text.Length : 0;
});
}
}
in your view add the link to the behavior namespace
xmlns:behav="clr-namespace:MyApp.Resources.Behaviors"
Add behavior to your Entry in the view
<Entry Text="{Binding something, Mode=TwoWay}" Keyboard="Numeric">
<Entry.Behaviors>
<behav:SelectContentWhenFocusedBehavior/>
</Entry.Behaviors>
</Entry>
The UWP custom entry renderer could be...
using System.ComponentModel;
using Xamarin.Forms;
using Xamarin.Forms.Platform.UWP;
[assembly: ExportRenderer(typeof(Entry), typeof(myApp.UWP.ExtendedEntryRenderer))]
namespace myApp.UWP
{
public class ExtendedEntryRenderer : EntryRenderer
{
protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(sender, e);
if (e.PropertyName == nameof(Entry.IsFocused)
&& Control != null && Control.FocusState != Windows.UI.Xaml.FocusState.Unfocused)
Control.SelectAll();
}
}
}