📂DateTimePickerApp
┣ 📂GUI
┃ ┣ 📜MainWindow.xaml # メインウィンドウのXAML定義
┃ ┗ 📜MainWindow.psm1 # メインウィンドウのイベント処理
┗ 📜App.ps1 # アプリケーションのメインスクリプト
<Window xmlns="<http://schemas.microsoft.com/winfx/2006/xaml/presentation>"
xmlns:x="<http://schemas.microsoft.com/winfx/2006/xaml>"
xmlns:win="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration"
xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
Title="DateTimePicker Demo" Height="350" Width="525">
<Grid>
<win:WindowsFormsHost Name="FormsHost" VerticalAlignment="Top" Margin="10">
<wf:DateTimePicker Name="DatePicker"/>
</win:WindowsFormsHost>
<Button Content="作成" VerticalAlignment="Bottom" Height="30" Margin="10" Name="CreateButton"/>
</Grid>
</Window>
# 画面作成
Function Get-MainWindow {
[xml]$Xaml = Get-Content ($PSCommandPath _replace ".xaml")
}
# MainWindowのイベント処理
Function Create-Folder {
# フォルダ名をDateTimePickerから取得
$date = $window.FindName("FormsHost").Child.Value.ToString("yyyyMMdd")
$path = [System.IO.Path]::Combine([Environment]::GetFolderPath("Desktop"), $date)
# フォルダをデスクトップに作成
[System.IO.Directory]::CreateDirectory($path)
}
$window.FindName("CreateButton").Add_Click({ CreateFolder })
# App.ps1
Add-Type -AssemblyName PresentationFramework
Add-Type -AssemblyName PresentationCore
Add-Type -AssemblyName WindowsBase
# モジュールの読み込み
Import-Module "$PSScriptRoot\\GUI\\MainWindow.psm1"
# クラシックフォームデザインの回避
# PowerShell ISEではあってもなくても新しいフォームデザインになるが、
# PowerShellではない場合に古いフォームデザインになる
[System.Windows.Forms.Application]::EnableVisualStyles()
# カスタムコントロールとメインウィンドウのクラスを読み込む
. "$PSScriptRoot\\Classes\\CustomDateTimePicker.psm1"
[xml]$Xaml = Get-Content "$PSScriptRoot\\GUI\\MainWindow.xaml"
# XAMLを読み込んでウィンドウを作成
$reader = (New-Object System.Xml.XmlNodeReader $Xaml)
$window = [Windows.Markup.XamlReader]::Load($reader)
# ウィンドウの表示と実行
$app = New-Object Windows.Application
$app.Run($window)
# MainWindow.psm1のインポート
. "$PSScriptRoot\\GUI\\MainWindow.psm1"
# ウィンドウの初期化とイベント関連付け
Initialize-MainWindow
クラス化
class MainWindow {
[void] Initialize() {
[xml]$Xaml = Get-Content ($PSCommandPath -replace ".psm1", ".xaml")
$reader = [System.Xml.XmlNodeReader]::new($Xaml)
$this.Window = [Windows.Markup.XamlReader]::Load($reader)
$this.Window.FindName("CreateButton").Add_Click({ $this.CreateFolder() })
}
[void] CreateFolder() {
$date = $this.Window.FindName("FormsHost").Child.Value.ToString("yyyyMMdd")
$path = [System.IO.Path]::Combine([Environment]::GetFolderPath("Desktop"), $date)
[System.IO.Directory]::CreateDirectory($path)
}
}
# 使用方法
$mainWindow = [MainWindow]::new()
$mainWindow.Initialize()
class MainWindow {
[System.Windows.Window]$Window
MainWindow() {
[xml]$Xaml = Get-Content ($PSScriptRoot -replace ".psm1", ".xaml")
$reader = [System.Xml.XmlNodeReader]::new($Xaml)
$this.Window = [Windows.Markup.XamlReader]::Load($reader)
$this.Window.FindName("CreateButton").Add_Click({ $this.CreateFolder() })
}
# [void] CreateFolder() {
# $date = $this.Window.FindName("FormsHost").Child.Value.ToString("yyyyMMdd")
# $path = [System.IO.Path]::Combine([Environment]::GetFolderPath("Desktop"), $date)
# [System.IO.Directory]::CreateDirectory($path)
# }
[void] CreateFolder() {
try {
$date = $this.Window.FindName("FormsHost").Child.Value.ToString("yyyyMMdd")
$path = [System.IO.Path]::Combine([Environment]::GetFolderPath("Desktop"), $date)
if (-Not (Test-Path $path)) {
[System.IO.Directory]::CreateDirectory($path)
} else {
[System.Windows.MessageBox]::Show("フォルダはすでに存在します。")
}
} catch [System.Exception] {
[System.Windows.MessageBox]::Show("エラーが発生しました: " + $_.Exception.Message)
}
}
[void] Show() {
$app = New-Object System.Windows.Application
$app.Run($this.Window)
}
}
Add-Type -AssemblyName PresentationFramework
Add-Type -AssemblyName PresentationCore
Add-Type -AssemblyName WindowsBase
# PowerShell ISEでは新しいフォームデザインになるが、PowerShellではない場合に古いフォームデザインになる
[System.Windows.Forms.Application]::EnableVisualStyles()
# MainWindowクラスを含むモジュールをインポート
Import-Module "$PSScriptRoot\\GUI\\MainWindow.psm1"
# MainWindowクラスのインスタンスを作成して初期化
$mainWindow = [MainWindow]::new()
$mainWindow.Initialize()
# アプリケーションを実行
#$app = New-Object Windows.Application
#$app.Run($mainWindow.Window)
$mainWindow.Show()