Blog de Laurent Valente

Responsable technique Microsoft , Akka technologies

Laurent Valente

moi

Consulatnt technique, Expert Microsoft chez AKKA Technologie.

J'accompagne les équipes sur les différents projets Microsoft.

Ma carte de visite Microsoft

Mon CV

Mon transcript

[.Net] Voir des diapositives power point dans une application WPF

Je devais rapidement faire une application qui permette, au travers de WPF de visualiser un contenu power point. Après de nombreuses recherches, j’ai vu des solutions payantes pour ouvrir directement un power point mais aucune gratuite. Du coup j’ai contourné le problème en convertissant les diapositives power point en images, puis en affichant simplement les images dans WPF. D’ailleurs si quelqu’un a une solution pour ouvrir un ppt ou pptx et le lire dans WPF, n’hésitez pas à me laisser des commentaires sur ce post, par avance merci !

Phase 1, convertir les diapositives en JPEG

On ouvre le power point en question et on fait « Enregistrer sous/Autres  formats » comme suit :

1

On choisit le format JPEG comme suit :

2

Power point nous pose la question :

3

Donc là ce sera sans doute chaque diapositive.

4

 

Voilà on a extrait chacune des diapositives au format JPEG, maintenant il ne s’agit plus que de faire un lecteur d’image tout bête.

L’interface WPF

Pour l’interface on va faire une listbox qui contiendra la liste des images, un composant image qui affichera les images et une zone à trois boutons précédent/suivant/diaporama. Le tout dans des Dockpanel afin de garder une cohésion lorsqu’on va agrandir la fenêtre. Voici  un petit aperçu sachant que la partie design devra être ultérieurement via Blend.

5

Le code Xaml :

<Window x:Class="WpfPpt3.MainWindow"

        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

        Title="Ausy" Height="600" Width="800" Name="Ausy">

    <Grid>

        <DockPanel Margin="0,0,0,522" Height="45" VerticalAlignment="Top"></DockPanel>

        <DockPanel HorizontalAlignment="Left" Margin="1,46,0,47" Name="dockPanel1" VerticalAlignment="Stretch" Width="221">

            <ListBox Height="466" Name="listBox1" Width="220" SelectionChanged="listBox1_SelectionChanged" />

        </DockPanel>

        <DockPanel HorizontalAlignment="Left" Margin="227,46,0,0" Name="dockPanel2" VerticalAlignment="Top" Width="Auto">

            <Image Height="Auto" Name="image1" Stretch="Fill" Width="Auto" />

        </DockPanel>

        <DockPanel Height="47"  Margin="0,0,516,0" Name="dockPanel3" VerticalAlignment="Bottom" LastChildFill="False">

            <Button Content="Precedent" Height="25" Name="btnprec" Width="72" Margin="10" Click="btnprec_Click" />

            <Button Content="suivant" Height="25" Name="btnsuivant" Width="56" Margin="10" Click="btnsuivant_Click" />

            <Button Content="Diaporama" Height="25" Name="btndiapo" Width="72" Margin="10" IsDefault="True" Click="btndiapo_Click" />

        </DockPanel>

    </Grid>

</Window>

 

Charger les images

Pour commencer on charge le contenu du répertoire dans la listbox :

public partial class MainWindow : Window

    {

        private System.Windows.Threading.DispatcherTimer timer;

        public MainWindow()

        {

            InitializeComponent();

            Moninit();

        }

        private void Moninit()

        {

            string[] maliste = System.IO.Directory.GetFiles(@".\Ressources\");

            listBox1.ItemsSource = maliste;

            if (listBox1.Items.Count > 0)

            {

                listBox1.SelectedIndex = 0;

            }

        }

Ici j’ai rapproché les images du code en les mettant dans un répertoire Ressouces, dans le bin/debug mais rien ne vous empêche de mettre le chemin d’un répertoire partagé ou autre.

En fait ici on ne charge que le path de chaque image contenue dans le répertoire, le tableau de string obtenu devient la source de ma listbox.

Le diaporama

La ligne contenant la variable globale à la classe « timer » sert pour la visualisation sous forme de diaporama, en effet voyons le code sur un clic sur le bouton diaporama :

private void btndiapo_Click(object sender, RoutedEventArgs e)

        {

            timer = new System.Windows.Threading.DispatcherTimer();

            timer.Interval = TimeSpan.FromSeconds(WpfPpt3.Properties.Settings.Default.montimer );

            timer.Tick += timer1_Tick;

            timer.Start();

        }

        private void timer1_Tick(object sender, EventArgs e)

        {

            listBox1.SelectedIndex = listBox1.SelectedIndex + 1;

        }

On retrouve notre variable « timer », on va initialiser son intervalle de tick dans un fichier setting, dans une variable de type int qu’on appelle « montimer » pour des tests vous pouvez directement remplacer “WpfPpt3.Properties.Settings.Default.montimer “ par 4 par exemple .

On précise qu’à chaque Tick on va appeler la méthode « timer1_Tick », et qu’à partir de là on lance le timer (« timer.Start(); »).

Dans la méthode « timer1_Tick », on va juste incrémenter la « listBox1.SelectedIndex » de 1.

 

Les boutons précédent et suivant

private void btnprec_Click(object sender, RoutedEventArgs e)

        {

            if (timer != null)

            {

                timer.Stop();

            }

            if (listBox1.SelectedIndex>0)

            {

                listBox1.SelectedIndex = listBox1.SelectedIndex - 1;

            }

        }

 

        private void btnsuivant_Click(object sender, RoutedEventArgs e)

        {

            if (timer!=null)

            {

                timer.Stop();

            }

            if (listBox1.SelectedIndex <listBox1.Items.Count )

            {

                listBox1.SelectedIndex = listBox1.SelectedIndex + 1;

            }

        }

Tout simplement on arrête le timer s’il est en cours, et on va incrémenter ou décrémenter le selected index de la listbox.

Le changement de selection

Mais quand est-ce qu’on affiche les images me direz vous ? Et bien tout est géré à partir de changement de selection dans la listBox donc on va le mettre là :

private void listBox1_SelectionChanged(object sender, SelectionChangedEventArgs e)

        {

            BitmapImage monimage = new BitmapImage();

            monimage.BeginInit();

            monimage.UriSource = new Uri(listBox1.SelectedValue.ToString(), UriKind.Relative);

            monimage.EndInit();

            image1.Stretch = Stretch.Fill;

            image1.Source = monimage;

        }

Ici on définit une variable BitmapImage donc la source est la sélection actuelle de la listBox. On configure le contrôle Image de notre interface pour qu’il se proportionne à la fenêtre et on lui passe la bitmapImage construite en tant que source.

 

Reste à refaire un design digne de ce nom. Encore une fois j’aurais préféré donner une source avec une extension ppt ou pptx mais je suis sûr que vous aller m’envoyer un lien pour ça ;)

 

Posted: Jun 29 2010, 10:59 by lvalente | Comments (6) RSS comment feed |
  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5
Filed under: .NET | Privé

Comments

Juliend said:

Je publie un article soon pour lire les pptx Smile
Soit patient !
Bravo pour l'article

# June 29 2010, 16:05

Juliend said:

Pour te mettre sur la voie:
-Soit tu utilise les PIA (DLL VSTO)
-Soit OpenXML SDK
Pour lire les ppts

# June 29 2010, 16:07

LaurentV said:

Merci pour les infos et les compliments, j'attends des new pour ton article, tiens moi au courant

# June 29 2010, 17:09

Thalasso said:

Sympa la méthode !
Pratique pour les réunions et autre brainstorming d'entreprise !!

# October 20 2010, 15:17

stiri online said:

Nice post, i`m looking forward for new ones, keep up the great work.

# March 26 2011, 09:51

home network support said:

This is a very nice post.
This is also very beautiful.
Because it contains lots of important information.
It helps me a lot.
I really have enjoyed reading your blog.
I will love to visit everyday.
Keep up doing good work.
Thank you.

# May 19 2011, 18:20

Add comment




biuquote
  • Comment
  • Preview
Loading

captcha

*