トップ回答者
図形の拡大、縮小表示について質問です。

質問
-
いつもお世話になります。
VisualC#2010、WindowsXPでの動作について質問があります。
図形の拡大、縮小表示について質問です。
WPFのコードビハインドで、ボタンを押したときにimageの表示サイズを変更したいと思っています。
<Image Height="170" HorizontalAlignment="Left" Margin="124,109,0,0" Name="image" Stretch="Fill" VerticalAlignment="Top" Width="170" Grid.Column="2" Source="image.png" />private void button_Click(object sender, EventArgs e){
//image.Visibility = Visibility.Hidden;
//grid.Children.Remove(image);
this.image.Width = 100;
this.image.Height = 100;
this.image.Stretch = Stretch.Fill;
//grid.Children.Add(image);
//this.image.Visibility = Visibility.Visible;
}これでできるかと思ったのですが、ボタンを押しても、imageのサイズが変更されません。
いちどVisibilityを変えたり、imageをRemoveしてもだめでした。
どうしたらよいでしょう?
回答
-
こちらの環境も XP/SP3、VisualC#2010 ですが、以下普通に動作しますね。
<Window x:Class="WpfApplication1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525"> <Grid> <Image Height="170" HorizontalAlignment="Left" Margin="124,109,0,0" Name="image" Stretch="Fill" VerticalAlignment="Top" Width="170" Source="image.png" /> <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="381,53,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" /> </Grid> </Window>
private void button1_Click(object sender, RoutedEventArgs e) { this.image.Width = 100; this.image.Height = 100; this.image.Stretch = Stretch.Fill; }
Grid の設定とかどうなってます?
ひらぽん http://d.hatena.ne.jp/hilapon/- 回答としてマーク 山本春海 2011年6月3日 8:15
-
ひらぽんさん、ありがとうございました。
Gridは、ふつうにGridのつもりで、なにもいじってない気がするんですが…。
そうでしたか。コード的には間違いない…。
うむむ。わからん…。コードでちゃんと、
this.image.Width = 100;
this.image.Height = 100;
this.image.Stretch = Stretch.Fill;
で値が100になることは確認できたのですが…。再描画されないんです。
なぜだ…。
Width と Height は実際の値を取得できない場合があるので、正確な値を調べたいなら ActualXXX プロパティを使って値を調べた方がいいです。以下のコードではどうでしょうか?UpdateLayout メソッドを使って画面を更新した後、ActualHeight と ActualWidth プロパティの値を調べてます。private void button1_Click(object sender, RoutedEventArgs e) { this.image.Width = 100; this.image.Height = 100; this.image.Stretch = Stretch.Fill; this.UpdateLayout(); MessageBox.Show(this.image.ActualHeight.ToString()); MessageBox.Show(this.image.ActualWidth.ToString()); }
ひらぽん http://d.hatena.ne.jp/hilapon/- 編集済み ひらぽんModerator 2011年5月10日 8:25 少し修正
- 回答としてマーク 山本春海 2011年6月3日 8:15
-
少し時間が空いてしまいましたが、ひとつ考えられる事例を思い出しました。もしかするとグラフィックドライバが原因かもしれません。
以前古い端末に WPF アプリをインストールしたら、起動したとたん例外吐いて終了しましたが、
グラボのドライバを更新にしたら、正常に動作したことがありました。また、以下のような事例もあります。
http://social.msdn.microsoft.com/Forums/ja-JP/wpfja/thread/b17437be-3e72-461d-be14-4d4084d1d7c3
さらにこういう話もあるようです。特定端末のみ描画がおかしければ、まずドライバを疑うのが常道のようですね。
http://connect.microsoft.com/VisualStudioJapan/feedback/details/582376/wpf#details
http://sygh.blog.ocn.ne.jp/blogitems/2011/01/visual_studio_2.html
http://quellencode.org/blog/?p=31
また別の事例ですが・・・・Dell Vostro 200・Vista Business SP2・メモリ1GB・G33/G31チップセット(最新ドライバ)
上記端末で WPF アプリのみ起動している場合は正常に動作しますが、複数アプリを起動して物理メモリを90%以上使用していると一部のコントロールのみ描画が更新されないという問題を確認しています。オンボードグラフィックの場合、メモリの空き容量にも影響されるようですね。
ひらぽん http://d.hatena.ne.jp/hilapon/- 回答としてマーク 山本春海 2011年6月3日 8:15
すべての返信
-
こちらの環境も XP/SP3、VisualC#2010 ですが、以下普通に動作しますね。
<Window x:Class="WpfApplication1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525"> <Grid> <Image Height="170" HorizontalAlignment="Left" Margin="124,109,0,0" Name="image" Stretch="Fill" VerticalAlignment="Top" Width="170" Source="image.png" /> <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="381,53,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" /> </Grid> </Window>
private void button1_Click(object sender, RoutedEventArgs e) { this.image.Width = 100; this.image.Height = 100; this.image.Stretch = Stretch.Fill; }
Grid の設定とかどうなってます?
ひらぽん http://d.hatena.ne.jp/hilapon/- 回答としてマーク 山本春海 2011年6月3日 8:15
-
ひらぽんさん、ありがとうございました。
Gridは、ふつうにGridのつもりで、なにもいじってない気がするんですが…。
そうでしたか。コード的には間違いない…。
うむむ。わからん…。コードでちゃんと、
this.image.Width = 100;
this.image.Height = 100;
this.image.Stretch = Stretch.Fill;
で値が100になることは確認できたのですが…。再描画されないんです。
なぜだ…。
Width と Height は実際の値を取得できない場合があるので、正確な値を調べたいなら ActualXXX プロパティを使って値を調べた方がいいです。以下のコードではどうでしょうか?UpdateLayout メソッドを使って画面を更新した後、ActualHeight と ActualWidth プロパティの値を調べてます。private void button1_Click(object sender, RoutedEventArgs e) { this.image.Width = 100; this.image.Height = 100; this.image.Stretch = Stretch.Fill; this.UpdateLayout(); MessageBox.Show(this.image.ActualHeight.ToString()); MessageBox.Show(this.image.ActualWidth.ToString()); }
ひらぽん http://d.hatena.ne.jp/hilapon/- 編集済み ひらぽんModerator 2011年5月10日 8:25 少し修正
- 回答としてマーク 山本春海 2011年6月3日 8:15
-
少し時間が空いてしまいましたが、ひとつ考えられる事例を思い出しました。もしかするとグラフィックドライバが原因かもしれません。
以前古い端末に WPF アプリをインストールしたら、起動したとたん例外吐いて終了しましたが、
グラボのドライバを更新にしたら、正常に動作したことがありました。また、以下のような事例もあります。
http://social.msdn.microsoft.com/Forums/ja-JP/wpfja/thread/b17437be-3e72-461d-be14-4d4084d1d7c3
さらにこういう話もあるようです。特定端末のみ描画がおかしければ、まずドライバを疑うのが常道のようですね。
http://connect.microsoft.com/VisualStudioJapan/feedback/details/582376/wpf#details
http://sygh.blog.ocn.ne.jp/blogitems/2011/01/visual_studio_2.html
http://quellencode.org/blog/?p=31
また別の事例ですが・・・・Dell Vostro 200・Vista Business SP2・メモリ1GB・G33/G31チップセット(最新ドライバ)
上記端末で WPF アプリのみ起動している場合は正常に動作しますが、複数アプリを起動して物理メモリを90%以上使用していると一部のコントロールのみ描画が更新されないという問題を確認しています。オンボードグラフィックの場合、メモリの空き容量にも影響されるようですね。
ひらぽん http://d.hatena.ne.jp/hilapon/- 回答としてマーク 山本春海 2011年6月3日 8:15
-
こんにちは、d-kot さん。
MSDN フォーラムのご利用ありがとうございます。オペレーターの山本です。
しばらく時間が経ちましたが、その後いかがでしょうか。
確認された結果や、その後の状況などお知らせいただけるとうれしいです。
参考になる情報をいただいていると思われましたので、他の方にも情報を有効活用いただくため、勝手ながら回答としてマークさせていただきました。
ひらぽんさん、アドバイスありがとうございます。
もし、解決していない場合には、確認されたことなどを記載して、ご質問を続けてくださいね。
よろしくお願いいたします。
日本マイクロソフト株式会社 フォーラム オペレーター 山本 春海