2011-12-06 6 views
6

Quello che sto cercando di fare è controllare una presentazione Powerpoint dalla mia applicazione WPF. Con il codice di questa domanda: C# - way to programmatically advance Powerpoint slide show? sta funzionando abbastanza bene per le diapositive normali.Advancing Powerpoint Slideshow programmaticamente con animazioni dei clic

Ma non appena arrivo a una diapositiva con un'animazione attivata da un mouseclick, non funziona come mi aspetterei che faccia. Quando si passa a una diapositiva di questo tipo, verrà visualizzata come previsto, ma quando chiamo objPres.SlideShowWindow.View.Next(), non fa nulla, e dopo il secondo o il terzo clic, passa direttamente alla diapositiva successiva, no animazione.

La cosa strana è: Quando chiamo objPres.SlideShowWindow.View.Next() tramite un timer, funziona! Le animazioni stanno funzionando come previsto.

Questo è il codice che ho:

Microsoft.Office.Interop.PowerPoint.Application oPPT; 
Microsoft.Office.Interop.PowerPoint.Presentations objPresSet; 
Microsoft.Office.Interop.PowerPoint.Presentation objPres; 
Microsoft.Office.Interop.PowerPoint.SlideShowView oSlideShowView; 
Timer slidetest; 

private void OpenPPT(object sender, RoutedEventArgs e) 
{ 
    //Create an instance of PowerPoint. 
    oPPT = new Microsoft.Office.Interop.PowerPoint.Application(); 
    // Show PowerPoint to the user. 
    oPPT.Visible = Microsoft.Office.Core.MsoTriState.msoTrue; 
    objPresSet = oPPT.Presentations; 


    OpenFileDialog Opendlg = new OpenFileDialog(); 

    Opendlg.Filter = "Powerpoint|*.ppt;*.pptx|All files|*.*"; 

    // Open file when user click "Open" button 
    if (Opendlg.ShowDialog() == true) 
    { 
     string pptFilePath = Opendlg.FileName; 
     //open the presentation 
     objPres = objPresSet.Open(pptFilePath, MsoTriState.msoFalse, 
     MsoTriState.msoTrue, MsoTriState.msoTrue); 

     objPres.SlideShowSettings.ShowPresenterView = MsoTriState.msoFalse; 
     System.Diagnostics.Debug.WriteLine(objPres.SlideShowSettings.ShowWithAnimation); 
     objPres.SlideShowSettings.Run(); 

     oSlideShowView = objPres.SlideShowWindow.View; 


     slidetest = new Timer(4000); 
     slidetest.AutoReset = false; 
     slidetest.Elapsed += new ElapsedEventHandler(slidetest_Elapsed); 
     slidetest.Start(); 

    } 
} 

void slidetest_Elapsed(object sender, ElapsedEventArgs e) 
{ 
    // this works as expected 
    oSlideShowView.Next(); 
} 

private void OnNextClicked(object sender, RoutedEventArgs e) 
{ 
    // this doesn't work, animations aren't shown at all. 
    oSlideShowView.Next(); 
} 

Sono sicuro che questa è una cosa facile e che sto sottovalutando qualcosa. Ma sto sbattere la testa su questo per un bel po 'di tempo :(

+0

In questo caso, il problema potrebbe essere che ci sono le animazioni a tempo che vengono eseguiti automaticamente Se è così, ho il sospetto PPT non risponderebbe a? oSlideShowView.Next è finito l'elaborazione dell'animazione –

+0

@ steve-rindsberg no, non ci sono animazioni temporizzate nel PPT che ho testato.Ho creato un progetto di test e l'ho caricato qui: https: // skydrive. live.com/redir.aspx?cid=edd93823761d5c8e&resid=EDD93823761D5C8E!10340&parid=EDD93823761D5C8E!139&authkey=!AMpcxEYSf90vv24, se vuoi dare un'occhiata a questo (c'è anche un test ppt in questo zip, che ha solo due diapositive, con un'animazione clic sulla prima diapositiva). – Malyngo

+0

Non sono un ragazzo C (forte, piatto, più, meno) e sono inondato al momento. Se avessi avuto il tempo di guardare, comunque non sarebbe stato di grande aiuto. Scusate. –

risposta

3

ho avuto la soluzione al mio problema sui forum MSDN: Quando si utilizza il tasto, l'animazione non gioca correttamente perché PPT non ha la messa a fuoco. quando posso attivare le SlideShowWindows prima di chiamare oSlideShowView.Next(), funziona:

private void OnNextClicked(object sender, RoutedEventArgs e) 
{ 
    oSlideShowView.Application.SlideShowWindows[1].Activate(); 
    oSlideShowView.Next(); 
}