質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

3回答

8312閲覧

WPFでウィンドウサイズを設定したい

siksmtt

総合スコア20

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

0クリップ

投稿2018/12/26 07:38

編集2018/12/26 08:12

WPFでウィンドウアプリケーションを作っています。
ウィンドウのサイズを以下の様にしたいのですが、なかなかうまくいきません。

・WindowおよびGrid横幅は固定(幅も同じ)
・WindowのHeightは起動時に画面のHeightいっぱいにするが、GridのHeightは固定(※)
・ただしWindowのHeightよりGridのHeightのほうが大きいので、スクロールバーを常に表示しスクロールできるようにする
・またユーザの操作としてウィンドウのリサイズはできない(最小化だけは可能)

文字にするのが難しいのですが、HTMLページを、Widthは固定かつ最小化のみできるブラウザで開くようなイメージです。

(※)
WindowsFormでいう、AutoScaleMode = System.Windows.Forms.AutoScaleMode.Fontと
ClientSize = New System.Drawing.Sizeを設定しているイメージになると思います。

一番最後についてはResizeMode="CanMinimize"でできたのですが、前3点が実現できた試しがないです。
恐らくxaml上で指定できると思っているのでできればxamlのみの設定で実現したいですが、
難しい場合はC#でsetするのも問題ないです。
ご助言いただけますと幸いです。

追記

ご指摘を受けたので、即席のコードですが追記いたします。
Width="300"、ResizeMode="CanMinimize"を指定した状態で、Height="1100"を画面のHeightに合わせ、
スクロールバーを表示させてラベルの一番した(「u」の文字)まで表示させたいと思っております。

xaml

1<Window x:Class="hoge.test" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 5 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 6 xmlns:local="clr-namespace:hoge" 7 mc:Ignorable="d" 8 Title="test" Height="1100" Width="300" ResizeMode="CanMinimize"> 9 <Grid> 10 <Label Content="a&#xD;&#xA;b&#xD;&#xA;c&#xD;&#xA;d&#xD;&#xA;e&#xD;&#xA;f&#xD;&#xA;g&#xD;&#xA;h&#xD;&#xA;i&#xD;&#xA;j&#xD;&#xA;k&#xD;&#xA;l&#xD;&#xA;m&#xD;&#xA;n&#xD;&#xA;o&#xD;&#xA;p&#xD;&#xA;q&#xD;&#xA;r&#xD;&#xA;s&#xD;&#xA;t&#xD;&#xA;u" HorizontalAlignment="Left" Height="1010" Margin="33,28,0,0" VerticalAlignment="Top" Width="224" FontSize="12"/> 11 <!--Contentsはこれ以外にもありますがあくまで例です--> 12 13 </Grid> 14</Window>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takabosoft

2018/12/26 07:53

おっしゃっている要件が理解できませんので、現在作ってもらっているXAMLを見せていただき、うまくいかない箇所を提示してもらえないでしょうか?(あと個人的に「縦幅」という表現は分かりづらいのでWidth, Heightに置き換えてもらった方がいいかも・・・)
siksmtt

2018/12/26 08:13

takabosoft様 ご指摘ありがとうございます。雑なコードですが追記・修正しましたので、ご確認いただけると幸いです。不足情報あれば再度ご指摘ください!
guest

回答3

0

SystemParameters.WorkArea.Heightで得られる値はピクセル値なので、
WPFの場合、DPI倍率を考慮する必要があります。

ということでこんなのはどうでしょうか?
DPI倍率を取得する拡張メソッドは、
http://grabacr.net/archives/1105
のリンク先のまんまです。

csharp

1using System.Windows; 2using System.Windows.Media; 3 4namespace hoge 5{ 6 /// <summary> 7 /// test.xaml の相互作用ロジック 8 /// </summary> 9 public partial class test : Window 10 { 11 public test() 12 { 13 InitializeComponent(); 14 Loaded += test_Loaded; 15 } 16 17 private void test_Loaded(object sender, System.Windows.RoutedEventArgs e) 18 { 19 Loaded -= test_Loaded; 20 21 Point factor = this.GetDpiScaleFactor(); 22 double pixelHeight = SystemParameters.WorkArea.Height; 23 double dipHeight = pixelHeight / factor.Y; 24 25 Height = dipHeight; 26 } 27 } 28 29 public static class VisualExtensions 30 { 31 /// <summary> 32 /// 現在の <see cref="T:System.Windows.Media.Visual"/> から、DPI 倍率を取得します。 33 /// </summary> 34 /// <returns> 35 /// X 軸 および Y 軸それぞれの DPI 倍率を表す <see cref="T:System.Windows.Point"/> 36 /// 構造体。取得に失敗した場合、(1.0, 1.0) を返します。 37 /// </returns> 38 public static Point GetDpiScaleFactor(this Visual visual) 39 { 40 var source = PresentationSource.FromVisual(visual); 41 if (source != null && source.CompositionTarget != null) 42 { 43 return new Point( 44 source.CompositionTarget.TransformToDevice.M11, 45 source.CompositionTarget.TransformToDevice.M22); 46 } 47 48 return new Point(1.0, 1.0); 49 } 50 } 51}

投稿2018/12/26 08:39

編集2018/12/26 08:42
runny_nose

総合スコア280

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takabosoft

2018/12/26 09:01

補足ありがとうございます!
siksmtt

2018/12/27 00:30

runny_nose様 補足・コードをご丁寧にありがとうございます!DPIというものを恥ずかしながら初めて知りました...。タブレット端末で使われる予定はないのですが、仕様として考慮しておくべき点だと思いました。参考にさせていただきます!
runny_nose

2018/12/27 04:25

DPIはタブレット限定の概念ではないですよ
guest

0

ベストアンサー

ちょっといじってみました。
Left,Top,Heightを指定して、ScrollViewerを足してあります。

画面に合わせて何か制御を行う場合、マルチモニター環境の事を考慮する必要があるかどうかを検討してください。
(↓は考慮されていません)

xaml

1<Window x:Class="WpfApplication24.MainWindow" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 5 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 6 xmlns:local="clr-namespace:WpfApplication24" 7 mc:Ignorable="d" 8 Title="MainWindow" 9 Width="300" 10 ResizeMode="CanMinimize" 11 Top="0" Left="0" 12 Height="{Binding Source={x:Static SystemParameters.WorkArea}, Path=Height}" 13 > 14 <ScrollViewer> 15 <Grid Background="Yellow"> 16 <Label Content="a&#xD;&#xA;b&#xD;&#xA;c&#xD;&#xA;d&#xD;&#xA;e&#xD;&#xA;f&#xD;&#xA;g&#xD;&#xA;h&#xD;&#xA;i&#xD;&#xA;j&#xD;&#xA;k&#xD;&#xA;l&#xD;&#xA;m&#xD;&#xA;n&#xD;&#xA;o&#xD;&#xA;p&#xD;&#xA;q&#xD;&#xA;r&#xD;&#xA;s&#xD;&#xA;t&#xD;&#xA;u" HorizontalAlignment="Left" Height="1010" Margin="33,28,0,0" VerticalAlignment="Top" Width="224" FontSize="12"/> 17 </Grid> 18 </ScrollViewer> 19</Window> 20

投稿2018/12/26 08:22

編集2018/12/26 08:35
takabosoft

総合スコア8356

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

siksmtt

2018/12/27 00:28

takabosoft様 ご丁寧にコードまでありがとうございます!こちらで試したところ、意図するように動きました。本当にありがとうございます!(マルチモニターの件は全く考えていなかったので、念頭に置いておこうと思います。)
guest

0

幅はMinWidthとMaxWidthを同じ値にしたら固定できます。
WindowにMinWidthとMaxWidthを指定してWindowState="Maximized"にすれば高さはめいっぱいになります。
スクロールバーはGridをScrollViewerに入れてください。

投稿2018/12/26 08:20

編集2018/12/26 08:36
hihijiji

総合スコア4150

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

siksmtt

2018/12/27 00:27

hihijiji様 返信遅くなってすみません。またいつもご回答ありがとうございます。MinとMaxを使う方法もあるのですね!ScrollViewerも試したのですが、挿入する位置が悪かったようで...参考にさせていただきます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問