win10 UWP Markdown 含源碼
Windows下沒有比較好的Markdown編輯器
我就自己寫一個
csdn的Markdown非常好,就是我須要截圖保存有麻煩
須要把我的截圖保存在本地,然後上傳
這個過程比較麻煩
csdn的圖沒法外鏈
我想把自己的博客放到github。發現都沒有圖片
我自己寫了的,能夠把截圖保存為圖片,放到用戶位置
然後插入![](image/file.png)
拖入圖片也插入![](image/file.png)
界面有編輯和設置
編輯由TopAppBar,TextBox作為輸入和TextBlock顯示
拖入文件能夠使用Drop
在Grid寫Drop="{x:Bind view.dropimg}" DragOver="Grid_DragOver"
Grid要AllowDrop="True"
在MainPage.xaml.cs
private void Grid_DragOver(object sender, DragEventArgs e) { e.AcceptedOperation = Windows.ApplicationModel.DataTransfer.DataPackageOperation.Copy; e.DragUIOverride.Caption = "打開"; e.Handled = true; }
在viewModel
public async void dropimg(object sender, Windows.UI.Xaml.DragEventArgs e)
dropimg 處理拖進來的DataPackageView
var defer = e.GetDeferral(); try { DataPackageView dataView = e.DataView; string str = await _m.clipboard(dataView); tianjia(str); } finally { defer.Complete(); }
文件有
MainPage.xaml
MainPage.xaml.cs
option.xaml
option.xaml.cs
viewModel.cs
model.cs
notify_property.cs
當中notify_property.cs提供繼承通知UI改變值
model包含
正在編輯文件file
保存位置folder
當中folder依據StorageApplicationPermissions.FutureAccessList獲得用戶位置。
能夠訪問的路徑不多,由於一個程序能夠訪問文件路徑多,不安全。假設每次放在一個不是程序文件夾的位置。都要用戶設置,非常麻煩。
在用戶第一次使用,讓用戶選擇一個位置,然後應用程序能夠直接訪問用戶選擇的這個,不用每次都選擇。
用戶輸入text
標題 name
當中text和name都是public string _text;
這樣是在viewModel使用。能夠OnPropertyChanged();
writetext是用戶能輸入,在沒有設置用戶位置。不能輸入
_open是否打開
public async Task clipboard(DataPackageView con)
處理剪貼板和拖入內容
本來我是處理剪貼板。由於拖入也是DataPackageView
public async Task<string> clipboard(DataPackageView con)
{
string str = string.Empty;
//文本
if (con.Contains(StandardDataFormats.Text))
{
str = await con.GetTextAsync();
//tianjiatext(str);
return str;
}
//圖片
if (con.Contains(StandardDataFormats.Bitmap))
{
RandomAccessStreamReference img = await con.GetBitmapAsync();
var imgstream = await img.OpenReadAsync();
Windows.UI.Xaml.Media.Imaging.BitmapImage bitmap = new Windows.UI.Xaml.Media.Imaging.BitmapImage();
bitmap.SetSource(imgstream);
Windows.UI.Xaml.Media.Imaging.WriteableBitmap src = new Windows.UI.Xaml.Media.Imaging.WriteableBitmap(bitmap.PixelWidth, bitmap.PixelHeight);
src.SetSource(imgstream);
Windows.Graphics.Imaging.BitmapDecoder decoder = await Windows.Graphics.Imaging.BitmapDecoder.CreateAsync(imgstream);
Windows.Graphics.Imaging.PixelDataProvider pxprd = await decoder.GetPixelDataAsync(Windows.Graphics.Imaging.BitmapPixelFormat.Bgra8, Windows.Graphics.Imaging.BitmapAlphaMode.Straight, new Windows.Graphics.Imaging.BitmapTransform(), Windows.Graphics.Imaging.ExifOrientationMode.RespectExifOrientation, Windows.Graphics.Imaging.ColorManagementMode.DoNotColorManage);
byte[] buffer = pxprd.DetachPixelData();
str = "image";
StorageFolder folder = await _folder.GetFolderAsync(str);
StorageFile file = await folder.CreateFileAsync(DateTime.Now.Year.ToString() + DateTime.Now.Month.ToString() + DateTime.Now.Day.ToString() + DateTime.Now.Hour.ToString() + DateTime.Now.Minute.ToString() + ".png", CreationCollisionOption.GenerateUniqueName);
using (var fileStream = await file.OpenAsync(FileAccessMode.ReadWrite))
{
var encoder = await Windows.Graphics.Imaging.BitmapEncoder.CreateAsync(Windows.Graphics.Imaging.BitmapEncoder.PngEncoderId, fileStream);
encoder.SetPixelData(Windows.Graphics.Imaging.BitmapPixelFormat.Bgra8, Windows.Graphics.Imaging.BitmapAlphaMode.Straight, decoder.PixelWidth, decoder.PixelHeight, decoder.DpiX, decoder.DpiY, buffer);
await encoder.FlushAsync();
str = $"![這裏寫圖片描寫敘述](image/{file.Name})";
}
}
//文件
if (con.Contains(StandardDataFormats.StorageItems))
{
var filelist = await con.GetStorageItemsAsync();
StorageFile file = filelist.OfType<StorageFile>().First();
return await imgfolder(file);
}
return str;
}
返回string是由於要把str插入到text,須要有Textbox光標插入
插入文件
public async Task<string> imgfolder(StorageFile file)
{
string str = "image";
StorageFolder image = null;
try
{
image = await _folder.GetFolderAsync(str);
}
catch
{
}
if (image == null)
{
image = await _folder.CreateFolderAsync(str, CreationCollisionOption.OpenIfExists);
}
file = await file.CopyAsync(image, file.Name, NameCollisionOption.GenerateUniqueName);
if (file.FileType == ".png" || file.FileType == ".jpg")
{
str = $"![這裏寫圖片描寫敘述](image/{file.Name})";
return str;
}
else
{
str = $"[{file.Name}](image/{file.Name})";
return str;
}
}
開始我沒實用文件
拖入和剪貼板僅僅用第一個文件
public async void accessfolder(StorageFolder folder)
更改用戶位置
public async void storage()
保存
在程序執行
folder = await Windows.Storage.AccessCache.StorageApplicationPermissions.FutureAccessList.GetFolderAsync(Windows.Storage.AccessCache.StorageApplicationPermissions.FutureAccessList.Entries[0].Token);
viewModel.cs
public string text
{
set
{
_m._text = value;
OnPropertyChanged();
}
get
{
return _m._text;
}
}
public string name
{
set
{
_m._name = value;
OnPropertyChanged();
}
get
{
return _m._name;
}
}
本來綁Textbox SelectionStart
SelectionStart錯誤
要用SelectionStart,僅僅能public Action selectchange;
在MainPage.xaml.cs
private void selectchange(int select, int selecti)
{
text.SelectionStart = select;
text.SelectionLength = selecti;
}
由於選擇能夠把![這裏寫圖片描寫敘述](image/{file.Name})
select Textbox選擇的插入
clipboard 保存剪貼板
storage 保存
accessfolder 更改用戶位置
public async void accessfolder()
{
FolderPicker pick = new FolderPicker();
pick.FileTypeFilter.Add("*");
StorageFolder folder = await pick.PickSingleFolderAsync();
if (folder != null)
{
_m.accessfolder(folder);
}
addressfolder = string.Empty;
}
model _m
private void tianjia(string str)
把str加入text
MainPage.xaml
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" AllowDrop="True" Drop="{x:Bind view.dropimg}" DragOver="Grid_DragOver">
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition />
<RowDefinition Height="auto"/>
</Grid.RowDefinitions>
<TextBox Text="{x:Bind view.name,Mode=TwoWay}" Grid.Row="0" Margin="10,10,10,10"/>
<TextBox x:Name="text" Text="{Binding Path=text,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Margin="10,10,10,10" Grid.Row="1" TextWrapping="Wrap" AcceptsReturn="True" IsReadOnly="{x:Bind view.writetext,Mode=OneWay}" SelectionChanged="text_SelectionChanged"/>
<!--<RichEditBox x:Name="rtext" Margin="10,10,10,10"/>-->
<TextBlock Text="{x:Bind view.reminder,Mode=OneWay}" Grid.Row="2" Margin="10,10,10,10" TextWrapping="Wrap"/>
<!--<Button Content="確定" Click="{x:Bind view.property}" Margin="121,300,0,308"/>-->
</Grid>
<Page.TopAppBar>
<CommandBar>
<!--<AppBarButton Icon="Add" Content="新建" Click="{x:Bind view.fileaddress}"/>-->
<AppBarButton Icon="OpenFile" Content="打開" Click="{x:Bind view.file_open}" />
<AppBarButton Icon="Save" Content="保存" Click="{x:Bind view.storage}"/>
<AppBarButton Icon="Setting" Content="設置" Click="option"/>
</CommandBar>
</Page.TopAppBar>
public sealed partial class MainPage
{
viewModel view;
public MainPage()
{
this.InitializeComponent();
text.Paste += Text_Paste;
}
private void Text_Paste(object sender, TextControlPasteEventArgs e)
{
view.clipboard(e);
}
private void Grid_DragOver(object sender, DragEventArgs e)
{
e.AcceptedOperation = Windows.ApplicationModel.DataTransfer.DataPackageOperation.Copy;
e.DragUIOverride.Caption = "打開";
e.Handled = true;
}
private void text_SelectionChanged(object sender, RoutedEventArgs e)
{
view.select = text.SelectionStart;
}
private void selectchange(int select, int selecti)
{
text.SelectionStart = select;
text.SelectionLength = selecti;
}
private bool _ctrl;
private void text_KeyDown(object sender, KeyRoutedEventArgs e)
{
if (e.Key.Equals(Windows.System.VirtualKey.Control))
{
_ctrl = true;
}
else if (e.Key == Windows.System.VirtualKey.V && _ctrl)
{
}
if (_ctrl)
{
if (e.Key == Windows.System.VirtualKey.Z)
{
}
}
e.Handled = true;
}
private void text_KeyUp(object sender, KeyRoutedEventArgs e)
{
if (e.Key.Equals(Windows.System.VirtualKey.Control))
{
_ctrl = false;
}
}
private void option(object sender, RoutedEventArgs e)
{
view.storage();
Frame frame = Window.Current.Content as Frame;
frame.Navigate(typeof(option), view);
}
protected override void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);
if (e.Parameter is viewModel)
{
view = e.Parameter as viewModel;
DataContext = view;
}
else
{
view = new viewModel();
view.selectchange = selectchange;
this.DataContext = view;
}
}
}
公布
https://dev.windows.com/zh-cn
登錄
在我的應用
填名字
本來想寫Markdown
只是自己做的不是非常好,不敢。就寫win
有人發了Markdown應用
點擊開始提交
價格免費
在visual studio
關聯
選擇創建的Markdown
得到
produproperty_StoreKey.pfx
在屬性
沒有password
配置
把produproperty_1.1.0.0_x86_x64_arm_bundle.appxupload上傳
https://code.csdn.net/lindexi_gd/lindexi_gd/tree/master/%E5%8D%9A%E5%AE%A2/win10%20UWP%20Markdown%20%E5%90%AB%E6%BA%90%E4%BB%A3%E7%A0%81.md
源碼
https://github.com/lindexi/Markdown
win10 UWP Markdown 含源碼