マークアップ拡張機能とは?
> <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());
> }
実行例
- PowershellだけでWPF表示(Powershell3.0でも2.0でも稼働)
- .Netframeworkは3.0以上が必要
- WPFの約束としてPowershellはSTAモードで動く必要あり
- 以下コードを
①Powershellコンソールにコピペして実行
②ISEで実行する時はすでにSTAモードなので適時修正して実行
注意:ブラウザによってはコピペで行頭に余分な空白が出来てしまうことあり
C:\temp> □'@ ← ここの行の行頭に空白あると動かない
-----------------------------------------------------
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 件のコメント:
コメントを投稿