翼度科技»论坛 编程开发 .net 查看内容

WPF使用Blazor的快速案例

5

主题

5

帖子

15

积分

新手上路

Rank: 1

积分
15
下面我们将讲解在WPF中使用Blazor,并且使用Blazor做一些文件编辑操作,下面是需要用到的东西

  • WPF
  • Blazor
  • Masa Blazor
  • Monaco
安装Masa Blazor模板

使用CMD指令安装模板
  1. dotnet new install MASA.Template
复制代码
新建Masa Blazor WPF App


  • 找到如图的模板,然后点击下一步

  • 下一步,新建项目名称FileEditor

添加Monaco


  • 打开wwwroot/index.html,并且引用Monaco的依赖,将一下依赖添加到body里面的最尾部。
  1. [/code][list=1]
  2. [*]新建Pages/Index.razor.cs文件
  3. [/list][code]using System.IO;
  4. using System.Text;
  5. using Masa.Blazor;
  6. using Masa.Blazor.Presets;
  7. using Microsoft.AspNetCore.Components;
  8. using Microsoft.JSInterop;
  9. namespace FileEditor.Pages;
  10. public partial class Index : IDisposable
  11. {
  12.     /// <summary>
  13.     /// 文本内容
  14.     /// </summary>
  15.     private string value;
  16.     private MMonacoEditor _editor;
  17.     private DotNetObjectReference<Index>? _objRef;
  18.     /// <summary>
  19.     /// 定义Monaco的初始配置
  20.     /// </summary>
  21.     private object options = new
  22.     {
  23.         language = "md", // 设置语法
  24.         automaticLayout = true, // 高度自适应
  25.         theme = "vs-dark", // 主题
  26.     };
  27.     private string fullName;
  28.     protected override void OnInitialized()
  29.     {
  30.         _objRef = DotNetObjectReference.Create(this);
  31.     }
  32.     /// <summary>
  33.     /// 具体文件路径
  34.     /// </summary>
  35.     [Parameter]
  36.     [CascadingParameter(Name = nameof(FullName))]
  37.     public string FullName
  38.     {
  39.         get => fullName;
  40.         set
  41.         {
  42.             fullName = value;
  43.             UpdateValue();
  44.         }
  45.     }
  46.     /// <summary>
  47.     /// Monaco初始化事件
  48.     /// </summary>
  49.     private async Task InitMonaco()
  50.     {
  51.         // 监听CTRL+S 2097 = CTRL+S 快捷键
  52.         // 调用Monaco的Command,传递当前对象,并且指定当触发快捷键的时候调用当签对象的指定方法。
  53.         await _editor.AddCommandAsync(2097, _objRef, nameof(SaveValue));
  54.     }
  55.     /// <summary>
  56.     /// 更新value
  57.     /// </summary>
  58.     private void UpdateValue()
  59.     {
  60.         if (string.IsNullOrEmpty(fullName))
  61.         {
  62.             return;
  63.         }
  64.         var info = new FileInfo(fullName);
  65.         if (!info.Exists) return;
  66.         using var fileStream = info.OpenText();
  67.         value = fileStream.ReadToEnd();
  68.     }
  69.     /// <summary>
  70.     /// 更新文件内容
  71.     /// </summary>
  72.     [JSInvokable]
  73.     public async Task SaveValue()
  74.     {
  75.         try
  76.         {
  77.             await using var fileStream = File.OpenWrite(fullName);
  78.             fileStream.Position = 0;
  79.             await fileStream.WriteAsync(Encoding.UTF8.GetBytes(value));
  80.             fileStream.Close();
  81.         }
  82.         catch (Exception e)
  83.         {
  84.             await PopupService.EnqueueSnackbarAsync(new SnackbarOptions()
  85.             {
  86.                 Title = "保存文件错误",
  87.                 Content = e.Message
  88.             });
  89.         }
  90.     }
  91.     public void Dispose()
  92.     {
  93.         _editor.Dispose();
  94.         _objRef?.Dispose();
  95.     }
  96. }
复制代码
在Index.razor.cs文件中我们实现了拦截FullName的set,当被set的时候说明上级组件选择了文件并且通过CascadingParameter传递了参数到当前组件。
并且对于当前的Value进行更新,
打开Index.razor
  1. @page "/"
  2. @inject IPopupService PopupService
  3. <MMonacoEditor InitCompleteHandle="async () => await InitMonaco()"
  4.                @bind-Value="value"
  5.                Height="@("100%")"
  6.                EditorOptions="options" @ref="_editor">
  7. </MMonacoEditor>
复制代码
我们对于cs的一些方法和参数进行了绑定,并且bind-value了value的值,我们在cs文件中更新了value就自动更新了UI的显示的值。
然后我们打开Shared/MainLayout.razor文件添加打开文件选择器,从而选择文件。
  1. @using Microsoft.Win32
  2. @inherits LayoutComponentBase
  3. <MApp>
  4.     <MAppBar App>
  5.         <MAppBarNavIcon @onclick="() => _drawer = !_drawer"></MAppBarNavIcon>
  6.         <MToolbarTitle>FileEditor</MToolbarTitle>
  7.         <MButton OnClick="OpenFile">打开文件</MButton>
  8.         <MSpacer></MSpacer>
  9.         <MButton Text Color="primary" Target="_blank" Href="https://docs.masastack.com/blazor/introduction/why-masa-blazor">About</MButton>
  10.     </MAppBar>
  11.     <MNavigationDrawer App @bind-Value="_drawer">
  12.         <MList Nav Routable>
  13.             <MListItem Href="/" Active>
  14.                 <MListItemIcon>
  15.                     <MIcon>mdi-home</MIcon>
  16.                 </MListItemIcon>
  17.                 <MListItemContent>
  18.                     <MListItemTitle>Home</MListItemTitle>
  19.                 </MListItemContent>
  20.             </MListItem>
  21.             <MListItem Href="/counter" Active>
  22.                 <MListItemIcon>
  23.                     <MIcon>mdi-plus</MIcon>
  24.                 </MListItemIcon>
  25.                 <MListItemContent>
  26.                     <MListItemTitle>Counter</MListItemTitle>
  27.                 </MListItemContent>
  28.             </MListItem>
  29.             <MListItem Href="/fetchdata" Active>
  30.                 <MListItemIcon>
  31.                     <MIcon>mdi-list-box</MIcon>
  32.                 </MListItemIcon>
  33.                 <MListItemContent>
  34.                     <MListItemTitle>Fetch data</MListItemTitle>
  35.                 </MListItemContent>
  36.             </MListItem>
  37.         </MList>
  38.     </MNavigationDrawer>
  39.     <MMain>
  40.         <MContainer Fluid >
  41.             <CascadingValue Value="fullName" Name="FullName">
  42.                 <MErrorHandler>
  43.                     @Body
  44.                 </MErrorHandler>
  45.             </CascadingValue>
  46.         </MContainer>
  47.     </MMain>
  48. </MApp>
  49. @code {
  50.     private bool? _drawer;
  51.     private string fullName;
  52.     private void OpenFile()
  53.     {
  54.         var openFileDialog = new OpenFileDialog();
  55.         openFileDialog.Title = "请选择您的文件";
  56.         openFileDialog.Filter = "文本文件 (*.txt, *.md)|*.txt;*.md";
  57.         bool? result = openFileDialog.ShowDialog();
  58.         if (result == true)
  59.         {
  60.             fullName = openFileDialog.FileName;
  61.         }
  62.     }
  63. }
复制代码
在这里我们将使用Microsoft.Win32.OpenFileDialog打开文件选择器,并且指定选择文件的类型,
当前文件选择器返回true,则fullName的值,fullName则会通过CascadingValue组件的绑定传递到内的所有子组件。
下面我们看看实际使用效果。

技术交流

qq群:452761192
wx:wk28u9123456789(请备注技术交流)
源码下载地址:https://code-token.oss-cn-beijing.aliyuncs.com/FileEditor.zip

来源:https://www.cnblogs.com/hejiale010426/archive/2023/09/01/17671769.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具