-->

UWP

UWPのプロジェクトを作る。
ツール - NuGetパッケージマネージャー - ソリューションのNuGetパッケージの管理を選ぶ。

001

検索文字列を入れるところにwin2dと入力して検索し、Win2D.uwpを選択して、プロジェクトにチェックをいれインストールする。

002

MainPage.xamlのPageタグに

    xmlns:canvas="using:Microsoft.Graphics.Canvas.UI.Xaml"

を追加する。

Gridに

        <canvas:CanvasControl Draw="CanvasControl_Draw" ClearColor="CornflowerBlue"/>

を追加する。

DrawイベントがWindowsフォームアプリケーションでのPaintイベントにあたる。

MainPage.xaml.csに

using Windows.UI;
using Microsoft.Graphics.Canvas.UI.Xaml;

を追加、MainPageクラスに

        private void CanvasControl_Draw(CanvasControl sender, CanvasDrawEventArgs args)
        {
            args.DrawingSession.DrawEllipse(155, 115, 80, 30, Colors.Black, 3);
            args.DrawingSession.DrawText("Hello, world!", 100, 100, Colors.Yellow);
        }

を追加する。

まー、Win2Dのドキュメントに書いてあるやつだな。楕円とHello, world!が表示される。



このエントリーをはてなブックマークに追加

Introduction
このエントリーをはてなブックマークに追加

UWPでWin2Dを使ってオフスクリーンに描画する - かずきのBlog@hatena
このエントリーをはてなブックマークに追加

メッセージボックスはMessageDialogクラスで次にように使う。

        private async void button_Click(object sender, RoutedEventArgs e)
        {
            await new MessageDialog("こんにちは!", "タイトル").ShowAsync();
        }
001

OK、キャンセルのようなボタンがあるメッセージボックスはContentDialogクラスを使う。

        private async void button1_Click(object sender, RoutedEventArgs e)
        {
            var dialog = new ContentDialog();
            dialog.Content = "どう?";
            dialog.PrimaryButtonText = "OK";
            dialog.SecondaryButtonText = "キャンセル";
            var ret = await dialog.ShowAsync();
            if(ret == ContentDialogResult.Primary) {
                Debug.WriteLine("OK!!!!");
            }
        }
002


このエントリーをはてなブックマークに追加

スレッドを使ってみる。まず、ThreadクラスがUWPにはないのでこれは使えない。スレッドプールのTaskクラスを使うことになる。

        private void button_Click(object sender, RoutedEventArgs e)
        {
            Task task = new Task(async () =>
            {
                for (int i = 0; i < 10; i++)
                {
                    Debug.WriteLine(i);
                    await Task.Delay(1000);
                }
                Debug.WriteLine("thread");
            });
            task.Start();
        }

Threadクラスが使えないのでSleepができない。かわりにTask.Delayを使う。

次に別のスレッドから直接UIの操作はできないんだが、それをするにはDispatcher.RunAsyncを使う。
こんな感じだ。

        private void button_Click(object sender, RoutedEventArgs e)
        {
            button.IsEnabled = false;
            Task task = new Task(async () =>
            {
                for (int i = 0; i < 10; i++)
                {
                    Debug.WriteLine(i);
                    await Task.Delay(1000);
                }
                Debug.WriteLine("thread");
                await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
                {
                    button.IsEnabled = true;
                });
            });
            task.Start();
        }


このエントリーをはてなブックマークに追加

↑このページのトップヘ