回答編集履歴
3
m
test
CHANGED
@@ -44,7 +44,17 @@
|
|
44
44
|
|
45
45
|
|
46
46
|
|
47
|
-
`PreviewDragOver`イベントでファイルのD&Dのみ検知して`Drop`イベントで非同期に画像の大きさを求める処理を書いています。非同期にしないとGUIが固まるかもしれないので非同期大事です。
|
47
|
+
`PreviewDragOver`イベントでファイルのD&Dのみ検知して`Drop`イベントで非同期に画像の大きさを求める処理を書いています。非同期にしないとGUIが固まるかもしれないので非同期大事です。この辺はMSが出してるサンプルほぼそのままです
|
48
|
+
|
49
|
+
[[XAML/C#] WPF におけるドラッグ アンド ドロップ (Windows フォームから WPF へ)](https://code.msdn.microsoft.com/windowsdesktop/XAMLCVB-WPF-Windows-WPF-a1c048ae)
|
50
|
+
|
51
|
+
|
52
|
+
|
53
|
+
|
54
|
+
|
55
|
+
|
56
|
+
|
57
|
+
画像の大きさは[`System.Drawing.Image.Size`](https://docs.microsoft.com/ja-jp/dotnet/api/system.drawing.image.size?view=netframework-4.7.2#System_Drawing_Image_Size)に丸投げしています。DLLへの参照を追加しないとビルドできないですが。[`System.Drawing.Image.FromFile`](https://docs.microsoft.com/ja-jp/dotnet/api/system.drawing.image.fromfile?view=netframework-4.7.2#System_Drawing_Image_FromFile_System_String_)の非同期版が見つからなかったので雑に`Task.Run`してますがまあ大丈夫でしょう、しらんけど。`Task.WhenAll`と`.Select`の組み合わせの使い方は
|
48
58
|
|
49
59
|
[neue cc - 非同期時代のLINQ](http://neue.cc/2013/12/04_435.html)
|
50
60
|
|
@@ -55,6 +65,34 @@
|
|
55
65
|
```charp
|
56
66
|
|
57
67
|
var sizes = await Task.WhenAll(files.Select(async fileName => await Task.Run(() => System.Drawing.Image.FromFile(fileName).Size)));
|
68
|
+
|
69
|
+
```
|
70
|
+
|
71
|
+
|
72
|
+
|
73
|
+
あとは結果表示の方に`Name="result"`とidつけて
|
74
|
+
|
75
|
+
|
76
|
+
|
77
|
+
```xaml
|
78
|
+
|
79
|
+
<TextBox Grid.Row="1" TextWrapping="Wrap" Margin="1" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Name="result"/>
|
80
|
+
|
81
|
+
```
|
82
|
+
|
83
|
+
|
84
|
+
|
85
|
+
とりあえず小数第四位までに四捨五入して適当に文字列作って`result.Text`に代入すれば表示されます。
|
86
|
+
|
87
|
+
|
88
|
+
|
89
|
+
```csharp
|
90
|
+
|
91
|
+
result.Text
|
92
|
+
|
93
|
+
= $"縦: x{Math.Round(sizes[0].Height * 1.0 / sizes[1].Height, 4)} x{Math.Round(sizes[1].Height * 1.0 / sizes[0].Height, 4)}\n"
|
94
|
+
|
95
|
+
+ $"横: x{Math.Round(sizes[0].Width * 1.0 / sizes[1].Width, 4)} x{Math.Round(sizes[1].Width * 1.0 / sizes[0].Width, 4)}";
|
58
96
|
|
59
97
|
```
|
60
98
|
|
2
more
test
CHANGED
@@ -19,3 +19,69 @@
|
|
19
19
|
![before](100d93414ca0da91039cde51924f508d.png)
|
20
20
|
|
21
21
|
![after](7c557aa09d660c7feff55baf2b61861e.png)
|
22
|
+
|
23
|
+
|
24
|
+
|
25
|
+
大して長いコードでもないしMVVMパターンとかもやってないのでGithub見れば1分で理解できるとは思うのですが、一応解説。
|
26
|
+
|
27
|
+
|
28
|
+
|
29
|
+
GUIでD&Dするとこと結果表示するところは高さが3:1になるようにしてます。`MinHeight`は保険。
|
30
|
+
|
31
|
+
|
32
|
+
|
33
|
+
```xaml
|
34
|
+
|
35
|
+
<Grid.RowDefinitions>
|
36
|
+
|
37
|
+
<RowDefinition Height="3*"/>
|
38
|
+
|
39
|
+
<RowDefinition Height="*" MinHeight="20"/>
|
40
|
+
|
41
|
+
</Grid.RowDefinitions>
|
42
|
+
|
43
|
+
```
|
44
|
+
|
45
|
+
|
46
|
+
|
47
|
+
`PreviewDragOver`イベントでファイルのD&Dのみ検知して`Drop`イベントで非同期に画像の大きさを求める処理を書いています。非同期にしないとGUIが固まるかもしれないので非同期大事です。画像の大きさは[`System.Drawing.Image.Size`](https://docs.microsoft.com/ja-jp/dotnet/api/system.drawing.image.size?view=netframework-4.7.2#System_Drawing_Image_Size)に丸投げしています。[`System.Drawing.Image.FromFile`](https://docs.microsoft.com/ja-jp/dotnet/api/system.drawing.image.fromfile?view=netframework-4.7.2#System_Drawing_Image_FromFile_System_String_)の非同期版が見つからなかったので雑に`Task.Run`してますがまあ大丈夫でしょう、しらんけど。`Task.WhenAll`と`.Select`の組み合わせの使い方は
|
48
|
+
|
49
|
+
[neue cc - 非同期時代のLINQ](http://neue.cc/2013/12/04_435.html)
|
50
|
+
|
51
|
+
に解説ありますね。
|
52
|
+
|
53
|
+
|
54
|
+
|
55
|
+
```charp
|
56
|
+
|
57
|
+
var sizes = await Task.WhenAll(files.Select(async fileName => await Task.Run(() => System.Drawing.Image.FromFile(fileName).Size)));
|
58
|
+
|
59
|
+
```
|
60
|
+
|
61
|
+
|
62
|
+
|
63
|
+
Ctrl+Cは
|
64
|
+
|
65
|
+
[3秒でわかるWPFでCtrl+C(Copy)のときになんか実行する方法](https://qiita.com/yumetodo/items/6781a34f19993ca11421)
|
66
|
+
|
67
|
+
で書いた方法で拾ってます。
|
68
|
+
|
69
|
+
|
70
|
+
|
71
|
+
```csharp
|
72
|
+
|
73
|
+
private void OnCtrlC(object sender, RoutedEventArgs e)
|
74
|
+
|
75
|
+
{
|
76
|
+
|
77
|
+
if (string.Empty != result.Text)
|
78
|
+
|
79
|
+
{
|
80
|
+
|
81
|
+
Clipboard.SetData(DataFormats.Text, result.Text);
|
82
|
+
|
83
|
+
}
|
84
|
+
|
85
|
+
}
|
86
|
+
|
87
|
+
```
|
1
つくっちまったぜ
test
CHANGED
@@ -1,3 +1,21 @@
|
|
1
1
|
もっと簡単にはC# + XAMLで書くことですね。文字コードとWin32APIとの格闘からとりあえず逃れられます。
|
2
2
|
|
3
3
|
https://code.msdn.microsoft.com/windowsdesktop/XAMLCVB-WPF-Windows-WPF-a1c048ae
|
4
|
+
|
5
|
+
|
6
|
+
|
7
|
+
追記
|
8
|
+
|
9
|
+
|
10
|
+
|
11
|
+
興味が湧いたのでC# + XAMLで作ってしまいました。D&DしたあとWindowをクリックしてCtrl+Cすればクリップボードに結果が入ります。
|
12
|
+
|
13
|
+
|
14
|
+
|
15
|
+
[https://github.com/yumetodo/ImageSizeRateCalculator](https://github.com/yumetodo/ImageSizeRateCalculator)
|
16
|
+
|
17
|
+
|
18
|
+
|
19
|
+
![before](100d93414ca0da91039cde51924f508d.png)
|
20
|
+
|
21
|
+
![after](7c557aa09d660c7feff55baf2b61861e.png)
|