Telerik - RadDragAndDropManager WPF Q2 2011 and backwards compatability

by Fabien Lavocat 28. July 2011 11:38

Telerik

If you use Telerik components (like me) for your applications, you probably downloaded the last version (Q2 2011) to have access to the new control RadBreadcrumb. But if you use the RadDragAndDropManager to manage easily your Drag & Drop features, you’ll notice that it doesn’t work anymore. Why? Because Telerik implemented some changes to this control into this last edition of the WPF package. Have a look at the Release History for WPF Q2 2011.

image

 

So here is the changes you have to implement to have a backward compatibility of your code with the last edition of the controls. You need to implement those changes in the constructor of your Page / UserControl:

public MyPage()
{
	// Uses legacy execution mechanism. through RadDragAndDropManager class.
	// This option is provided for backwards compatability.
	RadDragAndDropManager.ExecutionMode = DragExecutionMode.Legacy;

	InitializeComponent();

	this.Unloaded += (sender, e) =>
		{
			RadDragAndDropManager.ExecutionMode = DragExecutionMode.Default;
			RadDragAndDropManager.Initialize();
		};

}

Tags: ,

WPF

Telerik - Docking controls for WPF - Issue with the InvertedBooleanConverter

by Fabien Lavocat 28. January 2011 13:22

image

I’m working with Telerik controls from WPF, especially with the Docking features. This are very easy to use controls. I’ve noticed a small issue into the converter InvertedBooleanConverter. The behavior is not connect in TwoWay mode. In OneWay mode you received the inverted value, that is correct. But not in TwoWay mode. It is because the ConvertBack method is not well implemented into the version 2010.3.1110.35 of the tools. I reported this bug to Telerik, and it should be fixed soon. The workaround I suggest is to re implement the converter in your project, until Telerik implement the fix.

Here is the code of the converter:

public class InvertedBooleanConverter : IValueConverter
{
    public Object Convert(Object value, Type targetType, Object parameter, CultureInfo culture)
    {
        return ((value is Boolean) && !((Boolean)value));
    }

    public Object ConvertBack(Object value, Type targetType, Object parameter, CultureInfo culture)
    {
        return ((value is Boolean) && !((Boolean)value));
    }
}

Tags:

WPF

WPF - How to change the selection color for a ListBox

by Fabien Lavocat 27. January 2011 09:31

image

When you use a Listbox and all its derivate class (like the ListView), you probably want to change the selection color without editing all the style of the control. To do it, it is very easy, you have just to change  two system colors values: SystemColors.HighlightBrushKey and SystemColors.ControlBrushKey and apply them to the control.

To implement it, just add to resources of the ListBox control lines below, depending on what you want to do:

<ListBox.Resources>
    <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="Transparent" />
    <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Green" />
</ListBox.Resources>

Here is the result:

image

Tags:

WPF

New release of the TwoStatesButton for WP4

by Fabien Lavocat 30. December 2010 15:08
image

I just release the version 1.1 of the control TwoStatesButton for WPF 4. This update include a new way to use templates with WPF. The control is now based on Toggle Button like suggested by Julien Corioland Smile.

You can download this control on Codeplex for free Winking smile.

Untitled

Tags: ,

WPF

New CodePlex project TwoStatesButton for WPF 4

by Fabien Lavocat 23. December 2010 11:23

imageI just released, an hour ago, a new project on CodePlex. This project, TwoStatesButton, is a WPF control which looks like to the “switch button” of the iPhone. You can have the same behavior as the iPhone version, with ON / OFF values, and you can specify left and right values. I plan to add more features soon…

This very simple project is realized in C# 4 / WPF 4. I hope it will be useful for you.
To download example and the source code, go to http://twostatesbutton.codeplex.com/

Demo2

Tags: ,

WPF | Exemples de code

Introduction au nouveau Ribbon pour WPF

by Fabien Lavocat 10. September 2010 06:44

image

Je rentre d’un super séjour aux USA, durant lequel j’ai eu la chance de visiter New York, Los Angeles et Miami Sourire. C’est donc pourquoi il n’y a pas eu d’article depuis un petit moment. Je vais donc recommencer cette nouvelle saison par un article présentant le nouveau ruban Office pour WPF que Microsoft vient de publier.

Sans titre

Vous remarquerez que le thème utilisé est logiquement celui de Microsoft Office 2010. Ce contrôle est entièrement écrit en WPF et n’utilise donc plus de Wrapper, ce qui vous permet de pouvoir le personnaliser à volonté et de façon vraiment simple avec Expression Blend 4 si vous le souhaitez. Pour commencer une première application qui utilise ce Ribbon, vous devez commencer par le télécharger. Ensuite, dans Visual Studio 2010, créer une application WPF Ribbon Application :

Sans titre2

Et sous Expression Blend 4 :

Blend

Un petit exemple XAML très rapide pour créer le ruban présenté ci-dessus :

Entête XAML : xmlns:ribbon="clr-namespace:Microsoft.Windows.Controls.Ribbon;assembly=RibbonControlsLibrary"
Contrôle Ribbon :

<ribbon:Ribbon x:Name="Ribbon">
    <ribbon:Ribbon.ApplicationMenu>
        <ribbon:RibbonApplicationMenu SmallImageSource="Images\SmallIcon.png">
            <ribbon:RibbonApplicationMenuItem Header="Hello _Ribbon"
                                              
x:Name="MenuItem1"
                                              
ImageSource="Images\LargeIcon.png"/>
        </ribbon:RibbonApplicationMenu>
    </ribbon:Ribbon.ApplicationMenu>
    <ribbon:RibbonTab x:Name="HomeTab" Header="Accueil">
        <ribbon:RibbonGroup x:Name="Group1" Header="Group1">
            <ribbon:RibbonButton x:Name="Button1" LargeImageSource="Images\LargeIcon.png" Label="Button1" />

            <ribbon:RibbonButton x:Name="Button2" SmallImageSource="Images\SmallIcon.png" Label="Button2" />
            <ribbon:RibbonButton x:Name="Button3" SmallImageSource="Images\SmallIcon.png" Label="Button3" />
            <ribbon:RibbonButton x:Name="Button4" SmallImageSource="Images\SmallIcon.png" Label="Button4" />
                   
        </ribbon:RibbonGroup>
               
    </ribbon:RibbonTab>

    <ribbon:RibbonTab x:Name="toto" Header="Mon autre Ribbon Tab"
                      
ContextualTabGroupHeader="Contextual Tab Group">
        <ribbon:RibbonGroup x:Name="Group2" Header="Group2">
            <ribbon:RibbonButton x:Name="Button21" LargeImageSource="Images\LargeIcon.png" Label="Button21" />
        </ribbon:RibbonGroup>
    </ribbon:RibbonTab>

    <ribbon:Ribbon.ContextualTabGroups>
        <ribbon:RibbonContextualTabGroup Header="Contextual Tab Group" Visibility="Visible" Background="Red" />
    </ribbon:Ribbon.ContextualTabGroups>
</ribbon:Ribbon>

Pour créer des actions sur les boutons, l'utilisation des RoutedCommand est la bienvenue. Je vous invite à consulter la Guideline pour le design d’applications utilisant le ruban, télécharger Windows User Experience Interaction Guidelines (50 Mo et seulement en Anglais).

Enfin si vous avez besoin d'aide, laissez vos commentaires sur ce post, et consulter la documentation MSDN. La semaine prochaine nous verrons un exemple plus détaillé et concret sur l'utilisation de ce ruban dans une application.

Tags:

WPF

WPF - Utilisation des RoutedCommand

by Fabien Lavocat 13. August 2010 08:14

WPFLorsque l’on souhaite utiliser des patterns de développement tel que MVVM (Model View – View Model) il y a une chose à savoir maîtriser (parmi beaucoup d’autres), c’est les RoutedCommand. C’est objets vont nous permettre d’exécuter des actions lorsque des événements seront déclenchés dans l’interface utilisateur. Par exemple, lorsque vous allez cliquez sur un bouton, nous allons déclencher une action. Vous allez me dire, mais ça on sait déjà le faire de plusieurs manière :

Exemple A :

Côté XAML : <Button Content="Click Me!" Click="Button_Click" />
Côté code behind :
private void Button_Click(object sender, RoutedEventArgs e)
{
   
MessageBox.Show("Hello World!");
}

Exemple B :

En s’abonnant à l’événement Click directement dans le code behind : bt.Click += new RoutedEventHandler(Button_Click);

Utilisation simple des RoutedCommand

L’utilisation des patterns de développement, en particulier MVVM, nous insite à placer de moins en moins de code de ce style là (abonnement à des événements) dans le code behind. Voyons donc comment utiliser les RoutedCommand pour palier à ça. Une RoutedCommand est une classe qui implémente l’interface ICommand. Celle-ci posséde deux méthodes qui vont nous interesser, à savoir CanExecute et Execute. La première retourne un booléen disant si oui ou non l’action peut être déclenchée et la seconde représente l’action à exécuter.

Dans notre code behind, nous allons décrire une action qui permettra d’afficher un MessageBox (peu importe le déclencheur pour le moment) :

/// <summary>
/// Création de l'objet RoutedCommand.
/// </summary>
public static RoutedCommand HelloWorldCommand = new RoutedCommand();

/// <summary>
/// Détermine si la commande peut être exécutée ou non.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public void HelloWorldCommandCanExecute(Object sender, CanExecuteRoutedEventArgs e)
{
    e.CanExecute =
true;
}

/// <summary>
/// Exécute l'action.
/// </summary>
/// <param name="target"></param>
/// <param name="e"></param>
public void HelloWorldCommandExecuted(Object target, ExecutedRoutedEventArgs e)
{
   
MessageBox.Show("Hello World!");
}

Afin de pouvoir utiliser cette commande lorsque nous cliquerons sur un bouton, nous allons devoir déclarer cette commande dans le code XAML de cette façon :

<Window.CommandBindings>
    <CommandBinding Command="local:MainWindow.HelloWorldCommand"
                  
CanExecute="HelloWorldCommandCanExecute"
                  
Executed="HelloWorldCommandExecuted"/>
</Window.CommandBindings>

Maintenant, pour que celle-ci soit exécutée lorsque nous cliquons sur le boutton, nous devons associer cette commande à la propriété Command du Button : <Button Content="Click Me!" Command="local:MainWindow.HelloWorldCommand" />

Si vous cliquez sur le bouton, vous aurez un MessageBox avec inscrit “Hello World!”. Voilà, nous avons fait une première RoutedCommand de façon très simple. Allons un peu plus loin dans les possibilités offertes par ces objets.

Utilisation des CommandParameter

Ajoutons un TextBox à notre fenêtre. Nous allons afficher le texte du TextBox dans un MessageBox déclenché par le click du boutton, mais uniquement lorsqu’il y aura un texte dans le TextBox. Pour cela, passons le contenu du TextBox (propriété Text) en paramètre de la commande :

<StackPanel>
    <TextBox x:Name="txtName" />
    <Button Content="Click Me!"
          
Command="local:MainWindow.HelloWorldCommand"
          
CommandParameter="{Binding Path=Text, ElementName=txtName}" />
</StackPanel>

Nous allons lier la propriété CommandParameter à la propriété Text du contrôle txtName. Voici comment récupérer cette valeur dans le code C# :

/// <summary>
/// Détermine si la commande peut être exécutée ou non.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public void HelloWorldCommandCanExecute(Object sender, CanExecuteRoutedEventArgs e)
{
   
// Il faut vérifier que nous avons bien un objet en paramètre.
   
if (e.Parameter == null) return;

   
// On récupére la valeur.
   
String value = e.Parameter.ToString();

   
// On autorise l'exécution de la commande uniquement
   
// si l'on a du texte.
    e.CanExecute = value.Trim().Length > 0;
}

/// <summary>
/// Exécute l'action
/// </summary>
/// <param name="target"></param>
/// <param name="e"></param>
public void HelloWorldCommandExecuted(Object target, ExecutedRoutedEventArgs e)
{
   
if (e.Parameter == null) return;
   
String value = e.Parameter.ToString();

   
MessageBox.Show(String.Format("Hello {0}!", value));
}

Voilà le résultat :

Sans titre

Sans titre

L’activation / désactivation du boutton est effectuée automatiquement lorsque le contenu du TextBox change.

Utilisation des InputBindings

Enfin, voyons comment utiliser les racourcis clavier pour exécuter des commandes. Nous allons lier la touche Entrée du clavier à la commande HelloWorldCommand :

<Window.InputBindings>
    <KeyBinding Key="Enter"
              
Command="local:MainWindow.HelloWorldCommand"
              
CommandParameter="{Binding Path=Text, ElementName=txtName}" />
</Window.InputBindings>

Lorsque vous appuyez sur la touche Entrée, si vous avez entré un texte dans le TextBox, la commande HelloWorldCommand se déclenchera.

Comme vous pouvez le constater, il est vraiment simple de créer ses propres commandes et de les utiliser dans vos applications WPF. Si vous souhaitez télécharger l’exemple que j’ai utilisé, cliquez sur le lien suivant : DemoCommandWPF.zip (55 ko).

Tags:

WPF

WPF – Créer le contrôle NumericUpDown

by Fabien Lavocat 1. July 2010 09:49

WPFSi vous développez avec la technologie WPF, vous aurez surement remarqué l’absence de certains contrôles qui peuvent sembler indispensables tel que le NumericUpDown qui permet depuis un TextBox d’incrémenter et décrémenter une valeur à l’aide de deux boutons. Si vous faites à la fois du Silverlight, vous aurez forcement remarqué sa présence dans le Silverlight Toolkit, mais malheureusement il ne l’est pas dans le WPF Toolkit. Pour corriger ce petit problème, j’ai donc créer rapidement un contrôle NumericUpDown que je vous distribue gracieusement Sourire. Celui-ci est vraiment simple mais répond tout à fait à la demande de base. Vous pouvez en plus le personnaliser à volonter.

Pour utiliser ce contrôle dans vos applications, téléchargez le fichier DemoNumericUpDown.zip (116 ko). Dans votre projet WPF, récupérez le fichier NumericUpDown.xaml et importez-le. Ensuite, régénérez la solution et vous pourrez utiliser ce contrôle où bon vous semble.

app

Peut être que je le publierai sur CodePlex par la suite, juste pour le distribuer un peu plus largement.

Tags:

WPF

WPF – Comment créer des colonnes dans un ListView

by Fabien Lavocat 13. October 2009 08:30

WPF

Comme vous devez le savoir, en WPF il n’est pas possible (nativement) de passer en mode “détails” dans un ListView. Nous allons donc voir aujourd’hui comment faire.

Je commence par créer un ListView, je lui donne un nom (propriété Name) et au chargement de la fenêtre je vais charger des données (lstData.Items.Add(…)).

Ensuite je vais spécifier la propriété View de mon ListView avec un GridView à deux colonnes (pour l’exemple) et je vais lier ces colonnes aux propriétés des objets que je vais insérer dans mon ListView :

<ListView Name="lstData">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="Colonne A" DisplayMemberBinding="{Binding ValueA}"/>
            <GridViewColumn Header="Colonne B" DisplayMemberBinding="{Binding ValueB}"/>
        </GridView>
    </ListView.View>
</ListView>

Et voilà le résultat :

image

Remarque : Les colonnes sont redimensionnables et dimensionnées à la taille du contenu visible. En effet, les éléments présents dans la liste mais non affichés ne seront pas pris en compte pour la largeur des colonnes.

Télécharger la solution Visual Studio : DemoListView.zip (41,48 kb)

Tags:

WPF

WPF 4.0 – Les références d’objets

by Fabien Lavocat 2. October 2009 23:00

WPF

Travaillant actuellement sur un projet VSTO pour PowerPoint, dont les formulaires sont en WPF, j’utilise assez régulièrement le DataBinding entre les contrôles. Par exemple, faire en sorte que le texte d’un bouton soit celui que l’on entre dans un TextBox sans utiliser les événements (en l’occurrence ici TextChanged). Il faut utiliser le code XAML ci-dessous :

<Button Margin="138,12,0,0" Name="bt" HorizontalAlignment="Left"Width="96" 
    Content="{Binding ElementName=txtBox, Path=Text}" 
    Height="23" VerticalAlignment="Top" />
<TextBox Height="23" Margin="12,12,0,0" Name="txtBox" VerticalAlignment="Top" 
    HorizontalAlignment="Left" Width="120" />

Ce qui nous donne :

image

Mais la grande nouveauté qui arrive en WPF 4.0 est l’utilisation de x:Reference. Ce qui remplacera le Binding par : Content="{x:Reference txtBox}”

Tags:

WPF

About

Fabien Lavocat

Lavocat Fabien
Ingénieur Multimédia - TMM Communication



"Blog-Microsoft.fr is an independent blog and is not affiliated with, nor has it been authorized, sponsored, or otherwise approved by Microsoft Corporation."

Contactez-moi Send mail

MVP
Microsoft Most Valuable Professional
Client Application Development