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

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

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

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

Q&A

解決済

1回答

3224閲覧

WPF ActualWidthが取得できない(0になる)→Dispatcher.BeginInvokeでもダメ

ElecDove

総合スコア254

WPF

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

0グッド

0クリップ

投稿2017/12/31 16:17

お世話になります.

WPFアプリを作っているのですが,タイトルの通りActualWidthが取得できません.

検索したところ,レイアウトをつかさどる機能が非同期で行われるため,initializeComponent()の直後にActualWidthを取得してもまだレイアウトが決まっていないため取得できないというところまではわかりました.

その回避策として,
http://kuxumarin.hatenablog.com/entry/2017/05/20/WPF_%E3%81%AE_UserControl_%E3%81%A7_%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%AB%E3%81%AE%E9%AB%98%E3%81%95%E3%81%A8%E5%B9%85%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B
ではDispatcher.BeginInvokeを使えばよい,具体的には

C#

1 public UserControl1(){ 2 InitializeComponent(); 3 4 Dispatcher.BeginInvoke(new Action(() =>{ 5 Height.Text = ActualHeight.ToString(); 6 Width.Text = ActualWidth.ToString(); 7 }), 8 DispatcherPriority.Loaded); 9 }

というサンプルが示されておりましたので,私は以下のようにしました,

C#

1public MainWindow() { 2 InitializeComponent(); 3 4 //ショートカットキー用 5 this.CommandBindings.Add( 6 new CommandBinding(MainWindow.hogecommand, delegate (object sender, ExecutedRoutedEventArgs e) { Button_hogehoge_Click(null, null); }) 7 ); 8 9 MyBasicCanvas chart; 10 11 Dispatcher.BeginInvoke(new Action(() => { 12 13 if((int)MyBasicalCanvas.ActualWidth == 0) { 14 Console.WriteLine("0です"); 15 return; 16 } 17 18 chart = new MyBasicCanvas((int)MyBasicalCanvas.ActualWidth, (int)MyBasicalCanvas.ActualHeight); 19 20 MyBasicalCanvas.Source = chart.Brush.ImageSource; 21 } 22 ), DispatcherPriority.Loaded); 23 24//※MyBasicalCanvasというのは「Image」コントロールにつけた名前です.

しかし,何度やっても0しか取得できませんし,
優先度の引数を色々変えてみましたがどれもダメでした.

尚,Xamlの該当部分は以下のようになっています.

XML

1 2 <Image x:Name="MyBasicalCanvas" Margin="42,24,298,85" RenderOptions.EdgeMode="Aliased" RenderTransformOrigin="0.5,0.5" ClipToBounds="True"> 3 <Image.RenderTransform> 4 <TransformGroup> 5 <ScaleTransform ScaleY="-1" ScaleX="1"/> 6 <SkewTransform AngleY="0" AngleX="0"/> 7 <RotateTransform Angle="0"/> 8 </TransformGroup> 9 </Image.RenderTransform> 10 </Image>

何か考えられることがありましたら教えていただければと思います

よろしくお願いいたします,

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

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

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

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

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

guest

回答1

0

自己解決

解決しました.

あらかじめSourceを指定しておかないと幅が取得できないみたいです

今回,コントロールにあとから画像を表示するため何も指定していませんでしたが,
ダミーの画像を指定したところ取得できるようになりました.

正しい解決策かどうかはわかりませんが,とりあえずこれで動きそうです

投稿2018/01/02 03:11

ElecDove

総合スコア254

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問