[.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 :
On choisit le format JPEG comme suit :
Power point nous pose la question :
Donc là ce sera sans doute chaque diapositive.
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.
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 ;)