2013年1月3日木曜日

WPFデモ(Markup拡張)


マークアップ拡張機能とは?

>   <Button Style="{StaticResource SomeStyle}">押下</Button>

    ①マークアップ拡張機能は、XAML以外のクラス(Class名:StaticResource)をフック
    ②マークアップ拡張機能は、そのコントローラの属性値として利用される
    ③{}かっこ内の右辺は、このクラスのコンストラクタ・パラメータ
        例1
        >   <Button Content="{local:ShowTime First}"></Button>
                String値Firstをコンストラクタパラメータとしてクラスを生成
        例2
        >   <Button Content="{local:ShowTime Header=Second}"></Button>
                空のコンストラクタでクラスを生成し、プロパティHearderにString値Secondをセット

    ④このクラスは拡張クラスとして機能するように作られている必要あり(「MarkupExtention」クラスを拡張)
        >   public override object ProvideValue(IServiceProvider serviceProvider)
        >   {
        >       return string.Format("{0}: {1}", header, DateTime.Now.ToLongTimeString());
        >   }


実行例

  1. PowershellだけでWPF表示(Powershell3.0でも2.0でも稼働)
  2. .Netframeworkは3.0以上が必要
  3. WPFの約束としてPowershellはSTAモードで動く必要あり
  4. 以下コードを
      ①Powershellコンソールにコピペして実行
      ②ISEで実行する時はすでにSTAモードなので適時修正して実行
        注意:ブラウザによってはコピペで行頭に余分な空白が出来てしまうことあり
               C:\temp> □'@   ← ここの行の行頭に空白あると動かない 
    (ファイル:"c:\temp\work\MarkupExtensions.dll"を利用) ←メモリ上だけで何とかする方法もあるが今回は省略
    -----------------------------------------------------
    if ($host.Version.Major -eq 3) {
        powershell.exe
    } else {
        if ($host.Runspace.ApartmentState -eq "STA") {return}
        powershell.exe -version 2 -sta
    }

    $xaml_win =@'
    <Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:MarkupExtensions;assembly=MarkupExtensions"

        Title="Markup Extensions" Height="120" Width="175">
        <StackPanel>
            <Button Content="{local:ShowTime 1番目}"></Button>
            <Button Content="{local:ShowTime Header=2番目}"></Button>
        </StackPanel>
    </Window>
    '@  # <--ブラウザによっては、コピペ時に行頭に空白出来る。空白削除する必要あり

    $code = @'
    using System;
    using System.Windows.Markup;

    namespace MarkupExtensions
    {
        public class ShowTime: MarkupExtension
        {
            private string header = string.Empty;
            public string Header
            {
                get { return header; }
                set { header = value; }
            }

            public ShowTime(){ }
            public ShowTime( string input){ header = input; }

            public override object ProvideValue(IServiceProvider serviceProvider)
            {
                return string.Format("{0}: {1}", header, DateTime.Now.ToLongTimeString());
            }
        }
    }
    '@  # <--ブラウザによっては、コピペ時に行頭に空白出来る。空白削除する必要あり

    if ($host.Version.Major -eq 3) {
        Add-Type $code -OutputAssembly "c:\temp\work\MarkupExtensions.dll" `
                       -ReferencedAssemblies @("WindowsBase","PresentationCore","PresentationFramework","system.xaml")
        add-type -Path c:\temp\work\MarkupExtensions.dll
    } else {
        Add-Type $code -OutputAssembly "c:\temp\work\MarkupExtensions.dll" `
                       -ReferencedAssemblies @("WindowsBase","PresentationCore","PresentationFramework")
        add-type -Path c:\temp\work\MarkupExtensions.dll
    }
    $form = [System.Windows.Markup.XamlReader]::Parse($xaml_win)
    [void]$Form.ShowDialog()

    exit
    Remove-Item "c:\temp\work\MarkupExtensions.dll"
    -----------------------------------------------------


    0 件のコメント:

    コメントを投稿