WPF

[WPF] Empêcher l’utilisateur de coller une image dans un RichTextBox

Le contrôle RichTextBox de WPF est assez puissant, et très pratique quand on a besoin d’accepter une saisie en texte riche. Cependant, l’une de ses fonctionnalités peut devenir problématique : l’utilisateur peut coller une image. Selon ce qu’on veut faire du texte saisi par l’utilisateur, ce n’est pas forcément souhaitable. Quand j’ai cherché sur le web un moyen d’empêcher cela, les seules solutions que j’ai trouvées suggéraient d’intercepter la frappe de touches Ctrl-V, et de bloquer l’événement si le presse-papiers contient une image.

[WPF] Utiliser Linq pour filtrer, trier et grouper les données dans une CollectionView

WPF offre un mécanisme assez simple pour la mise en forme de collections de données, via l’interface ICollectionView et ses propriétés Filter, SortDescriptions et GroupDescriptions : // Collection à laquelle la vue est liée public ObservableCollection People { get; private set; } ... // Vue par défaut de la collection People ICollectionView view = CollectionViewSource.GetDefaultView(People); // Uniquement les adultes view.Filter = o => ((Person)o).Age >= 18; // Tri par nom et prénom view.

[WPF] Créer des styles paramétrables à l'aide des propriétés attachées

Je voudrais aujourd'hui partager avec vous une petite astuce que j'utilise souvent depuis quelques mois. Supposons que pour améliorer l'apparence de votre application, vous ayez créé des styles personnalisés pour les contrôles standards : Bon, je ne suis pas designer, hein… mais ça fera parfaitement l'affaire pour illustrer mon propos ;). Ces styles sont très simples, ce sont les styles par défaut des CheckBox et RadioButton dans lesquels j'ai seulement modifié les templates pour remplacer les BulletChrome par ces superbes marques bleues.

[WPF 4.5] Abonnement à un évènement à l’aide d’une markup extension

Voilà un certain temps que je n'avais plus parlé des markup extensions… J'y reviens à l'occasion de la sortie de Visual Studio 11 Developer Preview, qui introduit un certain nombre de nouveautés dans WPF. La nouveauté dont je vais parler n'est sans doute pas la plus spectaculaire, mais elle vient combler un manque des versions précédentes : le support des markup extensions pour les évènements. Jusqu'ici, il était possible d'utiliser une markup extension en XAML pour affecter une valeur à une propriété, mais on ne pouvait pas faire la même chose pour s'abonner à un évènement.

[WPF] Afficher une image GIF animée

WPF est une technologie géniale, mais parfois on a l'impression qu'il lui manque certaines fonctionnalités assez basiques… Un exemple souvent cité est l'absence de support pour les images GIF animées. En fait, le format GIF proprement dit est supporté, mais le contrôle Image n'affiche que la première image de l'animation. De nombreuses solutions à ce problème ont été proposées sur les forums et blogs techniques, généralement des variantes autour des approches suivantes :

[WPF] Comment faire un binding dans les cas où on n’hérite pas du DataContext

La propriété DataContext de WPF est extrêmement pratique, car elle est automatiquement héritée par tous les enfants de l’élément où elle est définie ; il n’est donc pas nécessaire de la redéfinir pour chaque élément qu’on veut lier aux données. Cependant, il arrive que le DataContext ne soit pas accessible pour certains éléments : c’est le cas des éléments qui n’appartiennent pas à l’arbre visuel ni à l’arbre logique. Il devient alors très difficile de définir une propriété ce ces éléments par un binding… Prenons un exemple simple : on veut afficher une liste de produits dans un DataGrid.

[WPF] Une grille simplifiée utilisant des attributs XAML

Le composant Grid est l'un des contrôles les plus utilisés en WPF. Il permet de disposer facilement des éléments selon des lignes et des colonnes. Malheureusement le code pour l'utiliser, bien que simple à écrire, est relativement lourd : <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="5"/> <RowDefinition Height="*"/> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="60" /> <ColumnDefinition Width="*" /> </Grid.ColumnDefinitions> <Label Content="Name" Grid.Row="0" Grid.Column="0" /> <TextBox Text="Hello world" Grid.Row="0" Grid.Column="1"/> <Rectangle Fill="Black" Grid.Row="1" Grid.ColumnSpan="2"/> <Label Content="Image" Grid.

[VS 2010] Support du binding dans les InputBindings

LA fonctionnalité qui manquait à WPF ! La beta 2 de Visual Studio 2010 est là depuis quelques jours, et apporte à WPF une nouveauté que j'attendais depuis longtemps : le support du binding dans les InputBindings. Pour rappel, le problème de la version précédente était que la propriété Command de la classe InputBinding n'était pas une DependencyProperty, on ne pouvait donc pas la définir par un binding. D'ailleurs, les InputBindings n'héritaient pas du DataContext, ce qui compliquait beaucoup les implémentations alternatives de cette fonctionnalité… Jusqu'ici, pour lier la commande d'un KeyBinding ou MouseBinding à une propriété du DataContext, il fallait donc passer par des détours pas forcément très élégants… J'avais fini par trouver une solution acceptable, détaillée dans ce post, mais qui me laissait assez insatisfait (utilisation de la réflexion sur des membres privés, pas mal de limitations…).

[WPF] Markup extensions et templates

Note : Ce billet est la suite de celui sur une markup extension qui met à jour sa cible, et réutilise le même code de départ. Vous avez peut-être remarqué que l'utilisation d'une markup extension personnalisée dans un template donnait parfois des résultats inattendus… Nous allons voir dans ce billet comment faire une markup extension qui se comporte correctement dans un template. Illustration du problème Reprenons l'exemple du précédent billet : une markup extension qui renvoie l'état de la connectivité réseau, et met à jour la propriété cible quand le réseau est connecté ou déconnecté :

[WPF] Tri automatique d’un GridView : suite

Il y a quelques mois, j'avais publié un billet où j'expliquais comment trier automatiquement un GridView lors du clic sur un en-tête de colonne. J'avais laissé un point ouvert : l'ajout d'un symbole dans l'en-tête de colonne pour indiquer visuellement la direction du tri. C'est maintenant chose faite ! Pour arriver à ce résultat, j'ai utilisé un Adorner : c'est un composant qui permet de dessiner “par-dessus” un élément graphique existant, sur une couche de dessin indépendante.