Включение/выключение TextBox только для чтения между двойным щелчком и событиями потери фокуса в wpf

У меня есть элемент управления, как показано ниже, xaml с включенным только чтением.

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

Теперь, когда я дважды щелкну это текстовое поле, я смогу ввести текст. Свойство только для чтения должно стать ложным

Если я перейду к другому элементу в окне, отличному от этого текстового поля, текстовое поле должно снова стать доступным только для чтения.

Я пытаюсь сделать это с помощью триггеров. но не получая правильный намек. Может ли кто-нибудь помочь мне здесь?


person shahul hameed    schedule 14.09.2013    source источник
comment
Вы хотите, чтобы это TextBox включало IsReadonly, когда оно теряло фокус?   -  person Lai32290    schedule 14.09.2013


Ответы (3)


Вы можете сделать это с помощью двух событий: MouseDoubleClick и LostFocus.

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

В вашем процедурном коде:

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;
}
person Lai32290    schedule 14.09.2013
comment
Я попробовал это. Это работает . Но когда я дважды щелкаю текстовое поле, нормальное поведение - все данные будут выбраны. при таком подходе курсор по умолчанию перемещается к последнему элементу содержимого. Но мне нужно нормальное поведение выбора курсора. Как я могу это сделать - person shahul hameed; 15.09.2013

Вы можете использовать Style и EventTrigger для этого.

<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>
person Eben    schedule 14.09.2013
comment
Нет, но поведение не такое, как мне нужно. - person shahul hameed; 16.09.2013
comment
Я попробовал, и это дает мне эту ошибку Невозможно анимировать свойство IsReadOnly в System.Windows.Controls.TextBox с помощью System.Windows.Media.Animation.ObjectAnimationUsingKeyFrames. - person Hossein Shahdoost; 23.12.2015

Вы можете использовать сборку System.Windows.Interactivity (msdn), чтобы сделать это.

Во-первых: создайте вспомогательный класс для установки свойств:

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>

Где i:

xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
person kmatyaszek    schedule 14.09.2013
comment
лицензированы ли эти сборки Blend SDK? - person shahul hameed; 15.09.2013
comment
@shahulhameed, вы можете использовать эту сборку. Проверьте эту тему: social.msdn.microsoft.com/Forums/expression/en-US/ - person kmatyaszek; 15.09.2013