📂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()