Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Thomas Lebrun

Tout sur WPF, LINQ, C# et .NET en général !

Actualités

[WPF] Développer un TextBlock éditable

Récemment, quelqu’un m’a demandé s’il était possible de développer un TextBlock éditable avec WPF. Le scénario est des plus classique: un bloc de texte qui passe en mode édition lorsque l’on double clic dessus et qui repasse en mode visualisation lorsque le contrôle perd le focus.

Pour arriver à ce résultat, une des possibilités est de passer par un Custom Control composé d’un TextBlock et d’une TextBox. Ainsi, dans le code de generic.xaml, on se retrouve avec:

<Style TargetType="{x:Type local:EditableTextBlock}">

    <Setter Property="Template">

        <Setter.Value>

            <ControlTemplate TargetType="{x:Type local:EditableTextBlock}">

                <Grid x:Name="PART_GridContainer"

                      Background="{TemplateBinding Background}"

                      Width="{TemplateBinding Width}"

                      Height="{TemplateBinding Height}">

                    <TextBlock x:Name="PART_TbDisplayText"

                               Visibility="Visible"

                               Background="{Binding TextBlockBackgroundColor, RelativeSource={RelativeSource AncestorType={x:Type local:EditableTextBlock}}}"

                               Foreground="{Binding TextBlockForegroundColor, RelativeSource={RelativeSource AncestorType={x:Type local:EditableTextBlock}}}"

                               Text="{Binding Text, RelativeSource={RelativeSource AncestorType={x:Type local:EditableTextBlock}}}" />

                    <TextBox x:Name="PART_TbEditText"

                             Visibility="Hidden"

                             Background="{Binding TextBoxBackgroundColor, RelativeSource={RelativeSource AncestorType={x:Type local:EditableTextBlock}}}"

                             Foreground="{Binding TextBoxForegroundColor, RelativeSource={RelativeSource AncestorType={x:Type local:EditableTextBlock}}}"

                             Text="{Binding Text, RelativeSource={RelativeSource AncestorType={x:Type local:EditableTextBlock}}}" />

                </Grid>

            </ControlTemplate>

        </Setter.Value>

    </Setter>

</Style>

Puis, au niveau du code behind, on se retrouve avec ce code:

[TemplatePart(Type = typeof(Grid), Name = EditableTextBlock.GRID_NAME)]

[TemplatePart(Type = typeof(TextBlock), Name = EditableTextBlock.TEXTBLOCK_DISPLAYTEXT_NAME)]

[TemplatePart(Type = typeof(TextBox), Name = EditableTextBlock.TEXTBOX_EDITTEXT_NAME)]

public class EditableTextBlock : Control

{

    #region Constants

 

    private const string GRID_NAME = "PART_GridContainer";

    private const string TEXTBLOCK_DISPLAYTEXT_NAME = "PART_TbDisplayText";

    private const string TEXTBOX_EDITTEXT_NAME = "PART_TbEditText";

 

    #endregion

 

    #region Member Fields

 

    private Grid m_GridContainer;

    private TextBlock m_TextBlockDisplayText;

    private TextBox m_TextBoxEditText;

 

    #endregion

 

    #region Dependency Properties

 

    public string Text

    {

        get { return (string)GetValue(TextProperty); }

        set { SetValue(TextProperty, value); }

    }

 

    public static readonly DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(EditableTextBlock), new UIPropertyMetadata(string.Empty));

 

    public Brush TextBlockForegroundColor

    {

        get { return (Brush)GetValue(TextBlockForegroundColorProperty); }

        set { SetValue(TextBlockForegroundColorProperty, value); }

    }

 

    public static readonly DependencyProperty TextBlockForegroundColorProperty = DependencyProperty.Register("TextBlockForegroundColor", typeof(Brush), typeof(EditableTextBlock), new UIPropertyMetadata(null));

 

    public Brush TextBlockBackgroundColor

    {

        get { return (Brush)GetValue(TextBlockBackgroundColorProperty); }

        set { SetValue(TextBlockBackgroundColorProperty, value); }

    }

 

    public static readonly DependencyProperty TextBlockBackgroundColorProperty = DependencyProperty.Register("TextBlockBackgroundColor", typeof(Brush), typeof(EditableTextBlock), new UIPropertyMetadata(null));

 

    public Brush TextBoxForegroundColor

    {

        get { return (Brush)GetValue(TextBoxForegroundColorProperty); }

        set { SetValue(TextBoxForegroundColorProperty, value); }

    }

 

    public static readonly DependencyProperty TextBoxForegroundColorProperty = DependencyProperty.Register("TextBoxForegroundColor", typeof(Brush), typeof(EditableTextBlock), new UIPropertyMetadata(null));

 

    public Brush TextBoxBackgroundColor

    {

        get { return (Brush)GetValue(TextBoxBackgroundColorProperty); }

        set { SetValue(TextBoxBackgroundColorProperty, value); }

    }

 

    public static readonly DependencyProperty TextBoxBackgroundColorProperty = DependencyProperty.Register("TextBoxBackgroundColor", typeof(Brush), typeof(EditableTextBlock), new UIPropertyMetadata(null));

 

    #endregion

 

    #region Constructor

 

    static EditableTextBlock()

    {

        DefaultStyleKeyProperty.OverrideMetadata(typeof(EditableTextBlock), new FrameworkPropertyMetadata(typeof(EditableTextBlock)));

    }

 

    #endregion

 

    #region Overrides Methods

 

    public override void OnApplyTemplate()

    {

        base.OnApplyTemplate();

 

        this.m_GridContainer = this.Template.FindName(GRID_NAME, this) as Grid;

 

        if(this.m_GridContainer != null)

        {

            this.m_TextBlockDisplayText = this.m_GridContainer.Children[0] as TextBlock;

            this.m_TextBoxEditText = this.m_GridContainer.Children[1] as TextBox;

 

            this.m_TextBoxEditText.LostFocus += this.OnTextBoxLostFocus;

        }

    }

 

    protected override void OnMouseDoubleClick(MouseButtonEventArgs e)

    {

        base.OnMouseDoubleClick(e);

 

        this.m_TextBlockDisplayText.Visibility = Visibility.Hidden;

        this.m_TextBoxEditText.Visibility = Visibility.Visible;

    }

 

    #endregion

 

    #region Event Handlers

 

    private void OnTextBoxLostFocus(object sender, RoutedEventArgs e)

    {

        this.m_TextBlockDisplayText.Visibility = Visibility.Visible;

        this.m_TextBoxEditText.Visibility = Visibility.Hidden;

    }

 

    #endregion

}

Comme vous pouvez le voir, rien de bien compliquer: lorsque l’utilisateur double-clique sur le TextBlock, on le masque et on affiche la TextBox à la place.

 

Voila qui pourrait servir à d’autre Wink

 

A+

Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :
Posted: mardi 16 décembre 2008 10:02 par Thomas LEBRUN
Classé sous : ,

Commentaires

Pas de commentaires

Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- Merci par Blog de Jérémy Jeanson le 10-01-2019, 20:47

- Office 365: Script PowerShell pour auditer l’usage des Office Groups de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 11:02

- Office 365: Script PowerShell pour auditer l’usage de Microsoft Teams de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 10:39

- Office 365: Script PowerShell pour auditer l’usage de OneDrive for Business de votre tenant par Blog Technique de Romelard Fabrice le 04-25-2019, 15:13

- Office 365: Script PowerShell pour auditer l’usage de SharePoint Online de votre tenant par Blog Technique de Romelard Fabrice le 02-27-2019, 13:39

- Office 365: Script PowerShell pour auditer l’usage d’Exchange Online de votre tenant par Blog Technique de Romelard Fabrice le 02-25-2019, 15:07

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Stream Portal par Blog Technique de Romelard Fabrice le 02-21-2019, 17:56

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Video Portal par Blog Technique de Romelard Fabrice le 02-18-2019, 18:56

- Office 365: Script PowerShell pour extraire les Audit Log basés sur des filtres fournis par Blog Technique de Romelard Fabrice le 01-28-2019, 16:13

- SharePoint Online: Script PowerShell pour désactiver l’Option IRM des sites SPO non autorisés par Blog Technique de Romelard Fabrice le 12-14-2018, 13:01