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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

MVVM

MVVM(Model View ViewModel)は構築上のデザインパターンで、表現ロジック(ViewModel)によってデータ(Model)からページ(View)を分離させます。

WPF

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

Q&A

解決済

3回答

12310閲覧

[WPF][MVVM] StatckPanelエリアのサイズ自動取得に関して

Base

総合スコア28

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

MVVM

MVVM(Model View ViewModel)は構築上のデザインパターンで、表現ロジック(ViewModel)によってデータ(Model)からページ(View)を分離させます。

WPF

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

0グッド

0クリップ

投稿2019/03/13 08:23

前提・実現したいこと

WPF・MVVMの設計にてソフトを作っています。

StackPanel のエリアサイズを動的に取得したいと試みていますが・・・なかなか取得できません。最初は固定値で入れておいても良いのでしょうか。。

考え方としては、Bindingにて取得する場合、最初に固定値を入れておき、その後、Windowが拡大されたときなど・・サイズ変更によって、その際に取得するようにするにはどうしたら良いのでしょうか?

よろしくお願い致します。

該当のソースコード

xaml

1 <Grid> 2 <StackPanel Width="{Binding SWidth}" Height="{Binding SHeight}"> 3 4 </StackPanel> 5 </Grid>

ViewModel側

C#

1 2using System.Windows; 3 4 5 double SWidth { get; set; } 6 double SHeight { get; set; } 7 8 public void Initialize() 9 { 10 var StackWidth = SizeToContent.Width; 11 var StackHeight = SizeToContent.Height; 12 13 SWidth = (double)StackWidth; 14 SHeight = (double)StackHeight; 15 16 }

試したこと

1)固定値を入れると、サイズは反映される。

2)SizeToContentを取得してみた。

補足情報(FW/ツールのバージョンなど)

開発環境:Visual Studio2015

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

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

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

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

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

Zuishin

2019/03/13 09:09 編集

どういうことかよくわかりません。「動的」「取得」あたりをもう少し普通の日本語で書いてください。各 3 行以上の分量を目安に、具体例を入れながらわかりやすくお願いします。
Base

2019/03/13 15:03

ありがとうございます。 動的というのは、このStackPanel のエリアが大きくなった場合、それに応じて、中に入れるイメージデータのサイズを変更したいと考えています。エリアのサイズを最初のサイズではなく、大きくなった時のサイズを元に、計算したいです。 取得というのは、そのStackPanel のサイズを値として取得することを考えています。データバインドでいえば、ActualHeight メソッドとActualWidth メソッドを利用するところの処理を、コードビハインドを使わずに進めたいと考えています。
Zuishin

2019/03/13 23:14 編集

イメージデータが複数あり、StackPanel の大きさに応じてそれを選択したいということでしょうか? もしそうだとしたら、イメージを表示するコントロールを作り、そのコントロールを StackPanel の中に入れて幅を合わせ、コントロール自身が自分の幅に応じて画像を選択するようにすると良いのではないかと思います。 計算が必要になってくる以上、XAML だけではできません。ビヘイビアを作る手もありますが、この場合はコントロールを作るほうがすっきりできると思います。
Base

2019/03/14 16:33

なるほど。 自分にはなかった考えです。 興味深いので、聞きたいのですが、イメージを表示するコントロールを作る。。という事は、具体的には、クラスを作って、そこでイメージのサイズをコントロールするということで、認識はあってますか?
Zuishin

2019/03/14 21:17

コントロールというのはボタンやリストボックスなどのような UI のパーツのことです。
guest

回答3

0

ベストアンサー

ActualWidth, ActualHeightの値をBindして取得するという点については、以下で解決すると思います。ただ、これだと結構ダサいし長ったらしいです。修正依頼でも指摘されているように、別のもっといい方法があるんじゃないか?と思ってます。
あと、どうでもいいことですが、ActualHeight/Widthは依存プロパティです。メソッドと言うのは違和感があります。

Binding ActualHeight and ActualWidth (Silverlight)
上記サイトに載っている、SizeChangeクラスを適当なところに定義したうえで、

Xaml

1<StackPanel local:SizeChange.IsEnabled="True" local:SizeChange.ActualHeight="{Binding Height, Mode=OneWayToSource}" local:SizeChange.ActualWidth="{Binding Width, Mode=OneWayToSource}" />

C#

1class ViewModelClass 2{ 3 public double Width { set => System.Diagnostics.Debug.WriteLine("Width:" + value); } 4 public double Height { set => System.Diagnostics.Debug.WriteLine("Height:" + value); } 5}

投稿2019/03/14 05:35

編集2019/03/14 06:20
moredeep

総合スコア1507

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

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

guest

0

WPF の UserControl で コントロールの高さと幅を取得する

具体的には、 ActualHeight メソッドと、 ActualWidth メソッドを利用することで取得できます。

やりたいことはこれかなと。

無理して、MVVM的なやり方より、コードビハインドで、SizeChangedイベントを仕込む方が楽だと思います。

投稿2019/03/13 14:18

kiichi54321

総合スコア1984

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

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

Base

2019/03/13 15:06

ありがとうございます。 まさに、それです!! 今回はMVVM的に進めるのが、一つの要素でして・・・何か手段はないかと、、なかなかコードが書けずにハマってます。。
guest

0

ありがとうございました。
実際は良いか・・・という話ではありますが、下記の方法で自己解決。

下記のクラスを追加

https://stackoverflow.com/questions/1083224/pushing-read-only-gui-properties-back-into-viewmodel

クラス内:frameworkElement.AssertNotNull("frameworkElement");はコメントアウト

xaml

1<Window x:Class... 2xmlns:local="クラス追加のフォルダ" 3 4 5 <Grid> 6 <StackPanel local:SizeObserver.Observe="True" local:SizeObserver.ObservedWidth="{Binding Width, Mode=OneWayToSource}" local:SizeObserver.ObservedHeight="{Binding Height, Mode=OneWayToSource}"> 7 8 </StackPanel> 9 </Grid> 10</Window>

C#

1 2 private double _Width; 3 public double Width 4 { 5 set 6 { 7 _Width = value; 8 } 9 10 } 11 private double _Height; 12 public double Height 13 { 14 set 15 { 16 _Height = value; 17 } 18 } 19 20 public void Initialize() 21 { 22 // 初期化の際に取得される 23 var w = _Width; 24 var h = _Height; 25 } 26

投稿2019/03/14 16:45

編集2019/03/14 16:51
Base

総合スコア28

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問