已解决,没有整理,直接贴上实现的代码: using Application.BaseData; using Application.Config; using Common.Logging; using Infrastructure; using Microsoft.Office.Core; using stdole; using System; using System.Collections.Generic; using System.IO; using System.Threading.Tasks; using Util.Controls.WinForm; using Utilities.Converter; using VarEnum; using WpfUi.View.MaterialSet; using WpfUi.ViewModel.MaterialSet; using WpfUi.ViewModel.MaterialSet.Model; namespace PowerPointAddIn.Vstor { /// <summary> /// 操作扩展 /// </summary> public class ContextMenuEx { private static readonly ILog _log = LogManager.GetLogger("ContextMenuEx"); readonly CommandBars cmdBars; readonly CommandBar cmdThumbnailsBar; CommandBarButton insertResourceBtn = null; public ContextMenuEx() { try { cmdBars = ThisAddIn.application.CommandBars; cmdThumbnailsBar = cmdBars[ThisAddIn.officeType == OfficeType.Office ? "Thumbnails" : "Slide Miniature Popup Menu"]; cmdThumbnailsBar.Reset(); SetInsertResource(); } catch (Exception err) { _log.Error(err); } } /// <summary> /// 设置素材插入 /// </summary> public void SetInsertResource() { CommandBarControls commandBarControls = cmdThumbnailsBar.Controls; foreach (CommandBarControl cmdBarCtrl in commandBarControls) if (cmdBarCtrl.Tag == "InsertResource") cmdBarCtrl?.Delete(); string icon_stem = Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase, @"Resources\icon-sucai32.png"); IPictureDisp pictureInsertResource = AxHostConverter.GetIPictureDisp(icon_stem); Globals.ThisAddIn.Dispatcher.Invoke(() => { insertResourceBtn = (CommandBarButton)commandBarControls.Add(MsoControlType.msoControlButton); insertResourceBtn.BeginGroup = true; insertResourceBtn.Tag = "InsertResource"; insertResourceBtn.Caption = "从云端插入"; insertResourceBtn.Picture = pictureInsertResource; insertResourceBtn.Click += InsertResourceBtn_Click; insertResourceBtn.Visible = true; }); } /// <summary> /// 切换素材插入 /// </summary> /// <param name="state">切换状态</param> public void SwitchInsertResource(bool state) { if (insertResourceBtn == null) return; try { insertResourceBtn.Visible = state; } catch (Exception err) { _log.Error(err); } } private void InsertResourceBtn_Click(CommandBarButton Ctrl, ref bool CancelDefault) { try { if (string.IsNullOrEmpty(Config.UserInfo?.UserId)) throw new Exception("请先登录") { Source = Envirment.ErrUiSource }; var viewMode = new MaterialSetViewModel(new BaseDataApplication(), Config.UserInfo.UserId, Config.SchoolCode); viewMode.InsertElement2Slide += InsertElement2Slide; viewMode.SetWindow(new MaterialSetView()); ThisAddIn.Show(viewMode.Window); } catch (Exception err) { Ex.GlobalUnCatchError(err); } } void InsertElement2Slide(List<Material> ChooseMaterials) { if (ChooseMaterials?.Count < 1) return; PptHelp pptHelp = new PptHelp(); try { ChooseMaterials.ForEach(p => { if (!InternetHelp.IsFileOrExt(p.MaterialUrl, out string ext)) { ThisAddIn.ShowDialog(new Resource.Control.AlertWin.alertWindow(new { message = "不是有效的文件[" + p.Name + "],导入失败", })); return; } if (p.MaterialType == MaterialType.图片) { pptHelp.AddImg(p.MaterialUrl); } else if (p.MaterialType == MaterialType.音频 || p.MaterialType == MaterialType.视频) { if (string.IsNullOrEmpty(ext)) { ThisAddIn.ShowDialog(new Resource.Control.AlertWin.alertWindow(new { message = "不能识别此文件[" + p.Name + "]的格式,导入失败", })); return; } string fileName = Path.Combine(Path.GetTempPath(), Path.ChangeExtension(Path.GetRandomFileName(), ext)); FormDownload formDownload = new FormDownload(new Uri(p.MaterialUrl), fileName); formDownload.ShowDialog(); pptHelp.AddMedia(fileName); Task.Run(() => { try { if (File.Exists(fileName)) { File.Delete(fileName); } } catch { } }); } }); } catch (Exception ex) { ThisAddIn.ShowDialog(new Resource.Control.AlertWin.alertWindow(new { message = ex.Message, })); } } } }
已解决,没有整理,直接贴上实现的代码: