前提・実現したいこと
毎回お世話になります。
今回もよろしくお願いします。
DataGridに「test.csv」の値を自動で読み込んだ後、
ユーザーが行を選択したら、DataGridの値を参照し画像を<Image>の場所に表示し
ユーザーの行選択切り替えに応じて、Imageもコロコロ切り替えようと思ってます。
別ウィンドウを表示し、画像を表示するところまでは問題なく出来たのですが
親のGridサイズからはみ出してしまうため困ってます。
親のGridサイズから画像がはみ出さないように
縦横比を固定して縮小したいと思っています。
最終的にどのくらい縮小したのか、というデータは必要で
「縦横比固定88%にした」などの情報は別途必要になってくるので
それは最終的にImageのWidthとかを取得すればいけるのかなと思っています。
現在、Stretch="Uniform"としてみましたが
画像のサイズは特に変わりませんでした。Widthとかを決めてないからかもしれませんが
親の値を引き継ぐものだと思っていたので、どうしてこの状況になるのかよくわかっていません。
動的にImageを読込んでいるからなのでしょうか?
実施したいこと
・左上を基準に、画面サイズにあわせて縦横比固定でImageを縮小したい
・画面にあわせて画像を拡大はしない
・(できたら)何%縮小したのかを取得したい
→たぶん、画面上のWidthなどを取得すればいけそうなので、
それについては情報がありそうです
発生している問題・エラーメッセージ
画像の表示はできたものの、画像が画面からはみ出してしまいます。
親サイズを取得し、それに合わせてコードで修正するしかないのでしょうか?
Canvasに入れている理由としては、
四角形とかを描いてImageの上に重ねる予定だからです。
ソースは必要最小限とし、抜粋しています。
該当のソースコード
xaml
1 2 <Grid> 3 <StackPanel> 4 <Grid Height="700" Width="700"> 5 <Canvas> 6 <Image x:Name="MyImage" Stretch="Uniform" HorizontalAlignment="Left" VerticalAlignment="Top"></Image> 7 </Canvas> 8 </Grid> 9 </StackPanel> 10 </Grid>
C#
1 public MainWindow() 2 3 var exeFolder = AppDomain.CurrentDomain.BaseDirectory; 4 var filename = exeFolder + "\pic\2.jpg" 5 InitializeComponent(); 6 BitmapImage bitmap = new BitmapImage(); // デコードされたビットマップイメージのインスタンスを作る。 7 try 8 { 9 bitmap.BeginInit(); 10 bitmap.UriSource = new Uri(filename); // ビットマップイメージのソースにファイルを指定する。 11 bitmap.EndInit(); 12 MyImage.Source = bitmap; // Imageコントロールにバインディングする。 13 14 this.Title = System.IO.Path.GetExtension(filename); // ファイルの拡張子をウインドウタイトルに表示する。 15 } 16 catch (Exception ex) 17 { 18 MessageBox.Show(ex.Message); 19 }
試したこと
WPF C# 画像表示 で色々と調べました。
大きなWPFの画面上に小さな画像表示、というのはたくさんありましたが
画面ピッタリに縦横比固定で表示というのは見つかっておりません。
Stretch="Uniform"
これで上手くいってくれると思ったのですが、
WPFのウィンドウサイズが小さくても画像を縮小してくれませんでした。
追加20210615
1200×800ピクセルの画像(jpg)を準備し、
ウィンドウサイズ、Imageサイズ全てをWidth=1200、Height=800にしてみました。
期待する動作としては、画面いっぱいいっぱいに表示されるというものですが
ウィンドウを広げてみたところ、少し拡大というか余りがありました。
表示されていなかった余白部分があるというか…。
ブレークポイントを設定し確認しましたが、
ActualHeight800、ActualWidth1200
Width800、Height1200
PixelHeight800、PixelWidth1200 と全て範囲内の値でした。
ギリギリの値を設定するのは良くないのでしょうか?
ウィンドウサイズに合わせたのでピッタリに表示されると思ったのですが
全部表示されていないようです。
調べた所、dpiが違うと勝手に拡大縮小されることがあるとあり
サイトに記載されていた以下のように設定しました。
<Image Width="{Binding RelativeSource={RelativeSource Self}, Path=Source.PixelWidth}" Height="{Binding RelativeSource={RelativeSource Self}, Path=Source.PixelHeight}"/>
しかし、表示も見た目も特に変わりませんでした。
できたら、ユーザーがウィンドウサイズを変更したときに
画像もあわせて縮小させたいと思っていますが
難しそうなので今は断念します。
補足情報(FW/ツールのバージョンなど)
VisualStudio 2019
.NET 4.5(だったはず)
WPF C# (※ WinFormではない)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2021/06/15 00:54
2021/06/15 01:03
退会済みユーザー
2021/06/15 01:13