1. 程式人生 > >win10 UWP Markdown 含源碼

win10 UWP Markdown 含源碼

object fin false size start 編輯 用戶輸入 dba pfx

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 含源碼