お世話になります.
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>
何か考えられることがありましたら教えていただければと思います
よろしくお願いいたします,

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。