none
図形の拡大、縮小表示について質問です。 RRS feed

  • 質問

  • いつもお世話になります。
    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してもだめでした。
    どうしたらよいでしょう?

    2011年5月10日 6:44

回答

  • こちらの環境も 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
    2011年5月10日 7:41
    モデレータ
  • ひらぽんさん、ありがとうございました。
    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/
    2011年5月10日 7:57
    モデレータ
  • 少し時間が空いてしまいましたが、ひとつ考えられる事例を思い出しました。もしかするとグラフィックドライバが原因かもしれません。

    以前古い端末に 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
    2011年5月17日 3:52
    モデレータ

すべての返信

  • こちらの環境も 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
    2011年5月10日 7:41
    モデレータ
  • ひらぽんさん、ありがとうございました。
    Gridは、ふつうにGridのつもりで、なにもいじってない気がするんですが…。
    そうでしたか。コード的には間違いない…。
    うむむ。わからん…。

    コードでちゃんと、
     this.image.Width = 100;
     this.image.Height = 100;
     this.image.Stretch = Stretch.Fill;
    で値が100になることは確認できたのですが…。再描画されないんです。
    なぜだ…。

    2011年5月10日 7:48
  • ひらぽんさん、ありがとうございました。
    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/
    2011年5月10日 7:57
    モデレータ
  • 少し時間が空いてしまいましたが、ひとつ考えられる事例を思い出しました。もしかするとグラフィックドライバが原因かもしれません。

    以前古い端末に 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
    2011年5月17日 3:52
    モデレータ
  • こんにちは、d-kot さん。

    MSDN フォーラムのご利用ありがとうございます。オペレーターの山本です。

    しばらく時間が経ちましたが、その後いかがでしょうか。
    確認された結果や、その後の状況などお知らせいただけるとうれしいです。

    参考になる情報をいただいていると思われましたので、他の方にも情報を有効活用いただくため、勝手ながら回答としてマークさせていただきました。
    ひらぽんさん、アドバイスありがとうございます。

    もし、解決していない場合には、確認されたことなどを記載して、ご質問を続けてくださいね。
    よろしくお願いいたします。
                                                                     
    日本マイクロソフト株式会社 フォーラム オペレーター 山本 春海

    2011年6月3日 8:19