C#桌面项目如何通过RadWindow.Prompt实现新建空文本文件功能
C#桌面端仿OneNote新建文本文件功能改造方案
核心实现步骤
- 替换原有文件选择逻辑:移除
OpenFileDialog相关代码,调用RadWindow.Prompt弹出文件名输入框,首先拦截无效输入场景:用户点击取消/关闭弹窗直接终止流程;用户输入为空、包含Windows文件名非法字符(\ / : * ? " < > |)、目标路径已存在同名文件时,弹出对应提示要求用户重新输入。 - 自动补全文件信息:如果用户输入的文件名没有带
.txt后缀,自动补全后缀,避免生成无扩展名的不可识别文件;使用Path.Combine()拼接目标存储目录和文件名,不要手动拼接路径分隔符,避免出现路径格式错误。 - 生成空白可编辑文本文件:调用文件IO接口创建空白文本文件,注意创建后及时释放文件句柄,避免文件被程序占用导致后续无法编辑。
- 调整数据入库逻辑:替换原有的文件复制逻辑,文件大小取实际生成的空白文件的真实长度(空白txt一般为0字节,不需要写死1024),其余入库参数、界面刷新逻辑可以复用原有代码。
- 细化异常捕获:不要用空catch块吞掉所有异常,针对权限不足、路径不存在、文件被占用等常见场景给出明确提示,方便排查问题。
改造后参考代码
private async void AddFile(object sender, RoutedEventArgs e) { // 弹出文件名输入窗口,不同Telerik版本Prompt参数可以根据实际API调整 var inputResult = RadWindow.Prompt("请输入新建文本文件名称", "新建文件"); // 用户点击取消/未输入有效内容直接返回 if (inputResult.DialogResult != true || string.IsNullOrWhiteSpace(inputResult.PromptResult)) { return; } string inputFileName = inputResult.PromptResult.Trim(); // 自动补全.txt后缀 if (!inputFileName.EndsWith(".txt", StringComparison.OrdinalIgnoreCase)) { inputFileName += ".txt"; } // 校验文件名非法字符 char[] invalidChars = Path.GetInvalidFileNameChars(); if (inputFileName.IndexOfAny(invalidChars) >= 0) { RadWindow.Alert("文件名包含非法字符,请重新输入"); return; } string targetDir = Settings[0].SettingValue; // 若目标目录不存在则提前创建 if (!Directory.Exists(targetDir)) { Directory.CreateDirectory(targetDir); } string targetFullPath = Path.Combine(targetDir, inputFileName); // 校验重名 if (File.Exists(targetFullPath)) { RadWindow.Alert("当前目录已存在同名文件,请更换名称"); return; } try { // 创建空白文本文件,using会自动释放文件流,避免文件被占用无法编辑 using (File.Create(targetFullPath)) { } // 取文件实际大小 long fileSize = new FileInfo(targetFullPath).Length; // 录入数据库,参数可根据实际业务逻辑调整 await _db.FileInsert(1, inputFileName, fileSize, targetFullPath, "a", "FileAddTest", "FileAddTest"); // 复用原有界面刷新逻辑 MessageBus.Default.Publish(new RefreshMessage(this, "Refresh")); } catch (Exception ex) { RadWindow.Alert($"文件创建失败:{ex.Message}"); } }
扩展优化点
- 如果需要支持其他类型的空白文件(比如md、rtf),可以在弹窗里增加文件类型下拉选项,根据用户选择对应补全后缀即可。
- 如果要更贴近OneNote的交互,可以在文件创建、界面刷新完成后,直接触发新文件的重命名/编辑态,减少用户操作步骤。
内容的提问来源于stack exchange,提问作者Schootkey
相关产品推荐
相关产品推荐

