2011-12-06 12 views
6

Lo que intento hacer es controlar una presentación de Powerpoint desde mi aplicación WPF. Con el código de esta pregunta: C# - way to programmatically advance Powerpoint slide show? funciona bastante bien para las diapositivas normales.Avanzando Powerpoint Slideshow programáticamente con clics de animaciones

Pero tan pronto como llegue a una diapositiva con una animación provocado por un clic de ratón, que no está funcionando lo que cabe esperar que haga. Al ir a una diapositiva tal, se mostrará como se esperaba, pero cuando llamo objPres.SlideShowWindow.View.Next(), no hace nada, y después del segundo o tercer clic, que va directamente a la siguiente diapositiva, sin animación.

Lo extraño es: Cuando llamo objPres.SlideShowWindow.View.Next() a través de un temporizador, ¡funciona! Las animaciones se ejecutan como se esperaba.

Este es el código que tengo:

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(); 
} 

Estoy seguro de que esto es algo fácil y que se me escapa algo. Pero estoy golpeando mi cabeza en esto por bastante tiempo :(

+0

En este caso, podría ser el problema que hay animaciones programadas que se ejecutan automáticamente Si es así, sospecho PPT no respondería a? oSlideShowView.Next unti se hace el procesamiento de la animación –

+0

@ Steve-rindsberg no, no hay animaciones programadas en el PPT he probado he creado un proyecto de prueba y subido aquí:.. https: // SkyDrive. live.com/redir.aspx?cid=edd93823761d5c8e&resid=EDD93823761D5C8E!10340&parid=EDD93823761D5C8E!139&authkey=!AMpcxEYSf90vv24, si quieres echar un vistazo a él (también hay un ppt prueba en esta postal, que simplemente tiene dos toboganes, con una animación de clic en la primera diapositiva). – Malyngo

+0

No soy un C (menos aguda, plana, además,) chico y me he inundado por el momento. Si tuviera tiempo de mirar, no ayudaría mucho de todos modos. Lo siento. –

Respuesta

3

Tengo la solución a mi problema en los foros de MSDN: Al usar el botón, la animación no se reproduce correctamente porque PPT no tiene el foco. cuando activo los SlideShowWindows antes de llamar oSlideShowView.Next(), funciona:

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