# プロジェクトフォルダの構成
📂SampleApp
┣ 📂Modules
┃ ┗ 📂DrugAndDropPathCopy
┃ ┗ 📜DrugAndDropPathCopy.psm1
┣ 📂gui
┃ ┗ 📜gui.xaml
┗ 📜main.ps1
# スクリプトのディレクトリパスを取得
$ScriptDir = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent
$ModuleDir = Join-Path $ScriptDir 'Modules'
# インポート
[xml]$XAML = Get-Content -Path (Join-Path $ScriptDir 'gui\\gui.xaml')
$DrugAndDropPathCopy = Import-Module (Join-Path $ModuleDir 'DrugAndDropPathCopy') -PassThru
# フォーム作成
$reader = (New-Object System.Xml.XmlNodeReader $XAML)
$Window = [Windows.Markup.XamlReader]::Load($reader)
# フォーム内の「Name」属性があるコントロールに同名の変数を定義する
$XAML.SelectNodes("//*[@Name]") | % { Set-Variable -Name ($_.Name) -Value $Window.FindName($_.Name) -Scope Script }
# フォーム内のコントロールにイベントを割り当てる
$TextBox.Add_PreviewDragOver({ AllowDrop($_) })
$TextBox.Add_Drop({ DropPathCopy($_) })
# フォーム表
$null = $Window.ShowDialog()
<Window
xmlns="<http://schemas.microsoft.com/winfx/2006/xaml/presentation>"
xmlns:x="<http://schemas.microsoft.com/winfx/2006/xaml>"
Title="ドラッグ&ドロップでファイルやフォルダのパスをコピーする" Height="150" Width="300">
<Grid>
<TextBox Name="TextBox" HorizontalAlignment="Left" Height="23" Margin="10,10,0,0" VerticalAlignment="Top" Width="260" AllowDrop="True"/>
</Grid>
</Window>
function AllowDrop ($e) {
$e.Handled = $true
}
function DropPathCopy ($e) {
$e.Handled = $true
$data = $e.Data.GetData([System.Windows.DataFormats]::FileDrop)
$e.Source.Text = $data
}