TextBox readonly on-off between double-click and lost focus events in wpf

I have a control, for example below xaml, with read only enabled.

<TextBox Text="{Binding Name,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Background="Transparent" IsReadOnly="True" BorderThickness="0" TextWrapping="Wrap" > 

Now, when I double-click this text box, I should be able to enter text. The Readonly property should become false.

If I move to another element in a window other than this text field, then the text field should be read again.

I am trying to do this with triggers. but not getting the right hint. Can someone help me here?

+6
source share
3 answers

You can do this with two events, MouseDoubleClick and LostFocus

 <Grid> <TextBox IsReadOnly="True" MouseDoubleClick="TextBox_MouseDoubleClick" LostFocus="TextBox_LostFocus"/> </Grid> 

In your procedural code:

 private void TextBox_MouseDoubleClick(object sender, MouseButtonEventArgs e) { TextBox textBox = sender as TextBox; textBox.IsReadOnly = false; //textBox.CaretIndex = textBox.Text.Count(); textBox.SelectAll(); } private void TextBox_LostFocus(object sender, RoutedEventArgs e) { TextBox textBox = sender as TextBox; textBox.IsReadOnly = true; } 
+4
source

You can use System.Windows.Interactivity assembly ( msdn ) to do this.

First: create a helper class to set properties:

 public class SetterAction : TriggerAction<DependencyObject> { public SetterAction() { Setters = new List<Setter>(); } public List<Setter> Setters { get; set; } protected override void Invoke(object parameter) { foreach (var item in Setters) { AssociatedObject.SetValue(item.Property, item.Value); } } } 

XAML:

 <TextBox Text="{Binding Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Background="Transparent" IsReadOnly="True" BorderThickness="0" TextWrapping="Wrap" Height="30" Width="200"> <i:Interaction.Triggers> <i:EventTrigger EventName="MouseDoubleClick"> <i:EventTrigger.Actions> <local:SetterAction> <local:SetterAction.Setters> <Setter Property="TextBox.IsReadOnly" Value="False" /> <Setter Property="TextBox.Background" Value="Green" /> </local:SetterAction.Setters> </local:SetterAction> </i:EventTrigger.Actions> </i:EventTrigger> <i:EventTrigger EventName="LostFocus"> <i:EventTrigger.Actions> <local:SetterAction> <local:SetterAction.Setters> <Setter Property="TextBox.IsReadOnly" Value="True" /> <Setter Property="TextBox.Background" Value="Red" /> </local:SetterAction.Setters> </local:SetterAction> </i:EventTrigger.Actions> </i:EventTrigger> </i:Interaction.Triggers> </TextBox> 

Where i :

 xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" 
+3
source

You can use the style and EventTrigger to do this.

 <Window xmlns:sys="clr-namespace:System;assembly=mscorlib" ...> <Window.Resource> <Style x:Key="MyTextBoxStyle" TargetType="{x:Type TextBox}"> <Style.Triggers> <EventTrigger RoutedEvent="LostFocus"> <EventTrigger.Actions> <BeginStoryboard> <Storyboard> <ObjectAnimationUsingKeyFrames Duration="0" Storyboard.TargetProperty="(TextBox.IsReadOnly)"> <DiscreteObjectKeyFrame KeyTime="0"> <DiscreteObjectKeyFrame.Value> <sys:Boolean>True</sys:Boolean> </DiscreteObjectKeyFrame.Value> </DiscreteObjectKeyFrame> </ObjectAnimationUsingKeyFrames> </Storyboard> </BeginStoryboard> </EventTrigger.Actions> </EventTrigger> <EventTrigger RoutedEvent="MouseDoubleClick"> <EventTrigger.Actions> <BeginStoryboard> <Storyboard> <ObjectAnimationUsingKeyFrames Duration="0" Storyboard.TargetProperty="(TextBox.IsReadOnly)"> <DiscreteObjectKeyFrame KeyTime="0"> <DiscreteObjectKeyFrame.Value> <sys:Boolean>False</sys:Boolean> </DiscreteObjectKeyFrame.Value> </DiscreteObjectKeyFrame> </ObjectAnimationUsingKeyFrames> </Storyboard> </BeginStoryboard> </EventTrigger.Actions> </EventTrigger> </Style.Triggers> </Style> </Window.Resource> ... <TextBox Style="{StaticResource MyTextBoxStyle}" .../> </Window> 
+3
source

Source: https://habr.com/ru/post/953823/


All Articles