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

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

ただいまの
回答率

90.51%

  • C#

    8507questions

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

  • WPF

    801questions

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

  • MVVM

    99questions

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

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

解決済

回答 3

投稿 ・編集

  • 評価
  • クリップ 0
  • VIEW 147

Base

score 2

前提・実現したいこと

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

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

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

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

該当のソースコード

   <Grid>
        <StackPanel Width="{Binding SWidth}" Height="{Binding SHeight}">

        </StackPanel>
    </Grid>

ViewModel側

using System.Windows;


        double SWidth { get; set; }
        double SHeight { get; set; }

        public void Initialize()
        {
            var StackWidth = SizeToContent.Width;
            var StackHeight = SizeToContent.Height;

            SWidth = (double)StackWidth;
            SHeight = (double)StackHeight;

        }

試したこと

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

2)SizeToContentを取得してみた。

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

開発環境:Visual Studio2015

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Zuishin

    2019/03/14 08:08 編集

    イメージデータが複数あり、StackPanel の大きさに応じてそれを選択したいということでしょうか?

    もしそうだとしたら、イメージを表示するコントロールを作り、そのコントロールを StackPanel の中に入れて幅を合わせ、コントロール自身が自分の幅に応じて画像を選択するようにすると良いのではないかと思います。

    計算が必要になってくる以上、XAML だけではできません。ビヘイビアを作る手もありますが、この場合はコントロールを作るほうがすっきりできると思います。

    キャンセル

  • Base

    2019/03/15 01:33

    なるほど。
    自分にはなかった考えです。

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

    キャンセル

  • Zuishin

    2019/03/15 06:17

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

    キャンセル

回答 3

checkベストアンサー

+2

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

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

<StackPanel local:SizeChange.IsEnabled="True" local:SizeChange.ActualHeight="{Binding Height, Mode=OneWayToSource}" local:SizeChange.ActualWidth="{Binding Width, Mode=OneWayToSource}" />
class ViewModelClass
{
        public double Width { set => System.Diagnostics.Debug.WriteLine("Width:" + value); }
        public double Height { set => System.Diagnostics.Debug.WriteLine("Height:" + value); }
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/03/15 01:35

    ありがとうございます。
    実は、自分もkiichi54321様から、SizeChangedイベントへの仕込みに関して調査し、下記のリンクを見つけて、実装中でした。

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

    実装方法を、自己解決に記載しておきます。
    具体的な方法のリンクをいただいたという事で、ベストアンサーに選ばせて頂きました。

    キャンセル

+1

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/03/14 00:06

    ありがとうございます。

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

    キャンセル

0

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

下記のクラスを追加

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

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

<Window x:Class...
xmlns:local="クラス追加のフォルダ"


   <Grid>
        <StackPanel local:SizeObserver.Observe="True" local:SizeObserver.ObservedWidth="{Binding Width, Mode=OneWayToSource}" local:SizeObserver.ObservedHeight="{Binding Height, Mode=OneWayToSource}">

        </StackPanel>
    </Grid>
</Window>
        private double _Width;
        public double Width
        {
            set
            {
                _Width = value;
            }

        }
        private double _Height;
        public double Height
        {
            set
            {
                _Height = value;
            }
        }

        public void Initialize()
        {
            // 初期化の際に取得される
            var w = _Width;
            var h = _Height;
        }

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • C#

    8507questions

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

  • WPF

    801questions

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

  • MVVM

    99questions

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