Windows 10 Build 10130 でxamlファイルを開くと...

Xamlファイルを開くとMicrosoft Edge(Project Spartan 15.10130.0)の挙動がおかしい。

Windows Presentation Foundation Host が正常に動作しないのかな?

新しいTabが永久に作成されるような動きをする...

 

Windows 10 を更新する方法「Build 10074 → 10130」

Windows 10 Pro Insider Preview Build 10074から10130に更新してみました。

更新方法は下記の通りです。

「設定→Update&Security→詳細オプション」
画面最下部の設定を「Slow」から「Fast」に変更します。

 

この設定の状態で更新プログラムを確認するとダウンロードが始まります。

 

…また容量不足でとまった。

もうハードディスクを買わないと何もできない。

残念。

容量をなんとか確保...ハードディスク買わないと辛い。

再起動すると下記のような画面になります。

f:id:GraySilverCoin:20150530202547p:plain

更新前

f:id:GraySilverCoin:20150530204847p:plain

 

更新後

f:id:GraySilverCoin:20150530204935p:plain

 

配置が変わっていますね。仕事率がオン/オフになっています。

 

WPF ウィンドウの表示

今回はWPFのウィンドウを表示する方法についてです。

表示方法はShow、ShowDialog、Visibilityがあるようです。

ShowとVisibilityはモードレスウィンドウになります。

モードレスウィンドウは他の操作をブロックしません。

SDI(Single Document Interface)を実装する場合はこれらを方法で行います。

 モーダルウィンドウはShowDialogメソッドを利用します。

 

それぞれのモーダル性を試したいと思います。

分離コードファイルを作成します。

using System;
using System.Windows.Controls;
using System.Windows;

namespace Test {
  public partial class MainWindow : Window {
    public MainWindow() {
      InitializeComponent();
    }
    public void ShowClicked(object sender, RoutedEventArgs e) {
      Window w = new Window();
      w.Title = "新しいWindowをShow";
      w.Show();
    }

    public void VisibilityClicked(object sender, RoutedEventArgs e) {
      Window w = new Window();
      w.Title = "新しいWindowのVisibility";
      w.Visibility = Visibility.Visible;
    }

    public void ShowDialogClicked(object sender, RoutedEventArgs e) {
      Window w = new Window();
      w.Title = "新しいWindowShowDialogで表示";
      w.ShowDialog();
    }
  }
}

 

MainWindow.xamlを作成します。

Window
  x:Class=\'Test.MainWindow\'
  xmlns:x=\'http://schemas.microsoft.com/winfx/2006/xaml\'
  xmlns=\'http://schemas.microsoft.com/winfx/2006/xaml/presentation\'
  Title=\'Hello World\'>
  <WrapPanel>
    <Button Click=\'ShowClicked\'>Show</Button>
    <Button Click=\'VisibilityClicked\'>Visibility</Button>
    <Button Click=\'ShowDialogClicked\'>ShowDialog</Button>
  </WrapPanel>
</Window>

 他のプロジェクトファイルやアプリケーションオブジェクトを用意し、

MSBuild等でコンパイルします。これでモーダル性が表現できました。

 

上記のソースでモードレスウィンドウを作成すると親のウィンドウを閉じても

子のモードレスウィンドウは残ったままになります。

一般的なアプリケーションでフローティングしているウィンドウがあると思いますが、これはモードレスウィンドウで親となっているウィンドウを閉じると他の子ウィンドウも閉じます。これをWPFで表現する場合はOwnerプロパティを設定します。

分離コードファイルを下記のように書き換えます。

using System;
using System.Windows.Controls;
using System.Windows;

namespace Test {
  public partial class MainWindow : Window {
    public MainWindow() {
      InitializeComponent();
    }
    public void ShowClicked(object sender, RoutedEventArgs e) {
      Window w = new Window();
      w.Owner = this;
      w.Title = \"新しいWindowをShow\";
      w.Show();
    }

    public void VisibilityClicked(object sender, RoutedEventArgs e) {
      Window w = new Window();
      w.Title = \"新しいWindowのVisibility\";
      w.Visibility = Visibility.Visible;
    }

    public void ShowDialogClicked(object sender, RoutedEventArgs e) {
      Window w = new Window();
      w.Title = \"新しいWindowShowDialogで表示\";
      w.ShowDialog();
    }
  }
}

 子ウィンドウは常に親ウィンドウの上に表示されますが、親ウィンドウの操作も可能です。

 

WPF マークアップファイルにC#の部分コードファイルを関連付ける

前回のマークアップファイルにC#の分離コードファイルを追加します。

追加するC#のクラスはマークアップファイルと同じにする必要があります。

MainWindow.xamlの場合はMainWindow.xaml.csです。

TextBoxコントロールのTextプロパティに ButtonコントロールのClickイベントで "Hello World" を設定します。

 

分離コードファイルを作成します。

using System;
using System.Windows.Controls;
using System.Windows;

namespace Test {
  public partial class MainWindow : Window {
    public MainWindow() {
      InitializeComponent();
    }
    public void Button1Clicked(object sender, RoutedEventArgs e) {
      _text1.Text = "Hello World";
    }
  }
}

 

MainWindow.xamlを作成します。

<Window
  x:Class='Test.MainWindow'
  xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'
  xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'
  Title='Hello World'>
  <WrapPanel>
    <Button Click='Button1Clicked'>Hello World1</Button>
    <Button>Hello World2</Button>
    <TextBox x:Name='_text1'></TextBox>
  </WrapPanel>
</Window>

x:Classでクラスを指定します。

Clickイベントで処理するメソッド名を指定します。

最後にTextBoxに x:Name で名前を指定します。

 

C#ファイルをインクルードするようにプロジェクトファイルを作成します。

<Project
  DefaultTargets='Build'
  xmlns='http://schemas.microsoft.com/developer/msbuild/2003'>

  <PropertyGroup>
    <Configuration>Debug</Configuration>
    <Platform>AnyCPU</Platform>
    <RootNamespace>Test</RootNamespace>
    <AssemblyName>Test</AssemblyName>
    <OutputPath>.\bin\Debug\</OutputPath>
  </PropertyGroup>

  <ItemGroup>
    <Reference Include='System' />
    <Reference Include='WindowsBase' />
    <Reference Include='PresentationCore' />
    <Reference Include='PresentationFramework' />
  </ItemGroup>

  <ItemGroup>
    <Compile Include='MainWindow.xaml.cs' />
    <Page Include='MainWindow.xaml' />
    <ApplicationDefinition Include='app.xaml' />
  </ItemGroup>

  <Import Project='$(MSBuildBinPath)\Microsoft.CSharp.targets' />
  <Import Project='$(MSBuildBinPath)\Microsoft.WinFX.targets' />
</Project>

 

 

WPF ウィンドウにコントロールを追加する

前回のウィンドウにコントロールを追加します。 

ginka.hatenadiary.jp

 MainWindow.xamlを変更します。

<Window

  xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'
  Title='Hello World'>
  <Button>Hello World</Button>
</Window>

これをMSBuildコンパイルすると下記の画面になります。

f:id:GraySilverCoin:20150524191045p:plain

Windowのレイアウトは子のコントロールを全体に表示されます。

次にButtonを2つにしてみます。

<Window
  xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'
  Title='Hello World'>
  <Button>Hello World1</Button>
  <Button>Hello World2</Button>
</Window>

これをコンパイルするとエラーになります。

f:id:GraySilverCoin:20150524191734p:plain

Windowコントロールは2つのコントロールを含めることができません。

2つ以上のコントロールを追加する場合はレイアウトコントロールを追加します。

例えばStackPanelやWrapPanelです。

 <Window
  xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'
  Title='Hello World'>
  <WrapPanel>
    <Button>Hello World1</Button>
    <Button>Hello World2</Button>
  </WrapPanel>
</Window> 

f:id:GraySilverCoin:20150524192359p:plain

 コンパイルできました。

WPF ウィンドウ定義を別のファイルにする

前回はアプリケーション定義内でウィンドウを定義しました。

 *1

ginka.hatenadiary.jp

一般的にウィンドウは別のファイルにします。

今回はウィンドウを別のファイルに作成し、そのウィンドウをプロジェクトファイルに追加したいと思います。

まずはウィンドウ用のファイルを作成します。

ファイル名はMainWindow.xamlにします。

<Window
  xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation' Title='Hello World'>
</Window>

 

App.xamlから下記の部分を削除します。

<Application
  xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation' >
  <Application.MainWindow>
    <Window Title='Hello World' Visibility='Visible' />
  </Application.MainWindow>
</Application>

 

プロジェクトファイルにPageビルド型を追加します。

<Project
  DefaultTargets='Build'
  xmlns='http://schemas.microsoft.com/developer/msbuild/2003'>

  <PropertyGroup>
    <Configuration>Debug</Configuration>
    <Platform>AnyCPU</Platform>
    <RootNamespace>Test</RootNamespace>
    <AssemblyName>Test</AssemblyName>
    <OutputPath>.\bin\Debug\</OutputPath>
  </PropertyGroup>

  <ItemGroup>
    <Reference Include='System' />
    <Reference Include='WindowsBase' />
    <Reference Include='PresentationCore' />
    <Reference Include='PresentationFramework' />
  </ItemGroup>

  <ItemGroup>
    <Page Include='MainWindow.xaml' />
    <ApplicationDefinition Include='app.xaml' />
  </ItemGroup>

  <Import Project='$(MSBuildBinPath)\Microsoft.CSharp.targets' />
  <Import Project='$(MSBuildBinPath)\Microsoft.WinFX.targets' />
</Project>

 

上記のファイルが用意できたらMSBuildでビルドしてください。

 

*1:Application.MainWindow

WPF Applicationオブジェクトをマークアップに変更する

前回の「MSBuildコンパイルしてみた」で作成したprogram.csをマークアップに変更します。

 

ginka.hatenadiary.jp

xamlファイル(app.xaml)を作成します。

<Application
  xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation' >
  <Application.MainWindow>
    <Window Title='Hello World' Visibility='Visible' />
  </Application.MainWindow>
</Application>

Windowを定義する場合は、Application.MainWindowを定義します。

今回はアプリケーション定義内でWindowを定義していますが一般的には

別のxamlファイルを作成します。

program.csは必要ないので削除します。

 

Test.csprojを変更します。

<Compile Include='program.cs' />を<ApplicationDefinition Include='app.xaml' />に変更します。

 

ビルドは前回の内容と同じです。

WPFではコードを記述する代わりに宣言型でプログラミングを行えるようになっています。