使用C# OneNote互操作创建页面时无法指定名称的问题求助
OneNote互操作创建带名称页面的问题修正
核心问题原因
OneNote页面的显示标题实际与页面内容中的Title元素绑定,层级XML中的name属性仅为同步字段;同时你的代码存在元素未添加到目标节点、命名空间复用不当的问题,导致无法正确设置页面名称。
方案1:修正UpdateHierarchy创建页面的代码
你创建了新的Page元素,但未将其添加到目标分区(Section)的子节点中,导致OneNote无法识别要创建的带名称页面。修正后的代码:
string globalXmlInitialStr; _oneNoteApp.GetHierarchy(null, OneNote.HierarchyScope.hsPages, out globalXmlInitialStr, OneNote.XMLSchema.xs2010); var globalXml = XDocument.Parse(globalXmlInitialStr); // 定位目标分区节点 var parentXml = globalXml.Descendants(ONE_NS + "Section") .First(elem => (string)elem.Attribute("ID") == _oneNoteApp.Windows.CurrentWindow.CurrentSectionId); // 创建带名称的Page元素,复用全局命名空间 var newPageXml = new XElement(ONE_NS + "Page"); newPageXml.SetAttributeValue("name", name); // 关键步骤:将新页面添加到分区节点下 parentXml.Add(newPageXml); // 提交层级更新 _oneNoteApp.UpdateHierarchy(globalXml.ToString(), OneNote.XMLSchema.xs2010);
方案2:修正CreatePage后设置名称的代码
用CreatePage生成空白页面后,需修改页面内容中的Title元素而非仅层级XML的name属性,才能让页面显示正确标题:
// 创建空白页面并获取ID string newPageId = _oneNoteApp.CreatePage(_oneNoteApp.Windows.CurrentWindow.CurrentSectionId); // 获取页面完整内容XML string pageContentXml; _oneNoteApp.GetPageContent(newPageId, out pageContentXml, OneNote.PageInfo.piAll, OneNote.XMLSchema.xs2010); var pageContentDoc = XDocument.Parse(pageContentXml); // 修改页面内容中的标题文本 var titleText = pageContentDoc.Descendants(ONE_NS + "Title") .First() .Descendants(ONE_NS + "OE") .First() .Descendants(ONE_NS + "T") .First(); titleText.Value = name; // 更新页面内容,层级中的name会自动同步 _oneNoteApp.UpdatePageContent(pageContentDoc.ToString(), OneNote.XMLSchema.xs2010);
关键注意事项
- 所有XML元素必须使用正确的命名空间
ONE_NS(即http://schemas.microsoft.com/office/onenote/2010/onenote),否则OneNote会忽略属性或元素 - 层级XML的
name属性与页面内容的Title元素双向同步,直接修改层级XML的name无法保证立即生效,优先修改页面内容的标题 - 使用
First()替代ElementAt(0),避免无匹配节点时抛出异常
内容的提问来源于stack exchange,提问作者Adel M.
相关产品推荐
相关产品推荐

