2011-12-28 13 views
1

書き込み可能なビットマップフォームSilverlightツールキットグラフを作成しようとすると問題が発生します。WriteableBitmapフォームチャートの問題を作成する

のTextBlockを使用する場合は、すべてが正常ですが、チャートを使用しようとした後、生成されたビットマップは空:(ある。

var data = new List<Point>(100); 
for (int i = 0; i < 100; i++) 
{ 
    data.Add(new Point(i, Math.Sin(i * Math.PI/50))); 
} 

Chart chart_ = new Chart() 
{ 
    Name = "Chart", 
    Width = 512, 
    Height = 512 
}; 
LineSeries line = new LineSeries() 
{ 
    Name = "Line", 
    Title = "test", 
    IndependentValuePath = "X", 
    DependentValuePath = "Y", 
    ItemsSource = data 
}; 
chart_.Series.Add(line); 

このコードは、それに正弦波でチャートを作成します。そして、Imはそれからビットマップを作成しようとしています。

LayoutRoot.Children.Add(chart_); // I tried to add chart_ to visual tree, It doesn't help 
//creates bitmap 
ScaleTransform t = new ScaleTransform() { ScaleX = 1.0, ScaleY = 1.0 }; 
//bitmap = new WriteableBitmap(chart_, t); Tried it also with this way 
bitmap = new WriteableBitmap(512, 512); 
bitmap.Render(chart_, t); 
texture = new Texture2D(GraphicsDeviceManager.Current.GraphicsDevice, bitmap.PixelWidth, bitmap.PixelHeight, false, SurfaceFormat.Color); 
bitmap.CopyTo(texture); 

すべてこのコードは、空の作成Bitmap.But私はTextBlockのか、楕円のようないくつかのプリミティブを使用する場合、すべての作品。イム必ず、チャートを生成するコードは、原因チャートをSilverlightコントロールに細かい生成され、罰金です。

編集: この方法でビットマップを作成しようとしましたが、役に立たないです。

chart_.InvalidateMeasure(); 
bitmap = new WriteableBitmap(512, 512); 
bitmap.Render(chart_, null); 
bitmap.Invalidate(); 

EDIT 2: 私はグラフがビジュアルツリーになりたくありません。私はアプリケーションのXNAの部分でそれを使用するよりも、そのイメージを生成する必要があります。

答えて

0

わずかな変更が加えられましたが、Chartingパッケージを追加するためにNuGetを使用した後は、大きな変更はSystem.Windows.Controlsへの参照を手動で追加することになると思われます。あなたが軌道に乗る必要があります

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Net; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Animation; 
using System.Windows.Shapes; 
using System.Windows.Controls.DataVisualization.Charting; 
using System.Windows.Media.Imaging; 

namespace SilverlightApplication1 
{ 
    public partial class MainPage : UserControl 
    { 
     Chart chart_; 

     public MainPage() 
     { 
      InitializeComponent(); 

      var data = new List<Point>(100); 
      for (int i = 0; i < 100; i++) 
      { 
       data.Add(new Point(i, Math.Sin(i * Math.PI/50))); 
      } 

      chart_ = new Chart() 
      { 
       Name = "Chart", 
       Width = 512, 
       Height = 512 
      }; 
      LineSeries line = new LineSeries() 
      { 
       Name = "Line", 
       Title = "test", 
       IndependentValuePath = "X", 
       DependentValuePath = "Y", 
       ItemsSource = data 
      }; 
      chart_.Series.Add(line); 
      LayoutRoot.Children.Add(chart_); // I tried to add chart_ to visual tree, It doesn't help 
     } 

     private void LayoutRoot_Loaded(object sender, RoutedEventArgs e) 
     { 
      //creates bitmap 
      WriteableBitmap bitmap; 
      ScaleTransform t = new ScaleTransform() { ScaleX = 1.0, ScaleY = 1.0 }; 
      //bitmap = new WriteableBitmap(chart_, t); Tried it also with this way 
      bitmap = new WriteableBitmap(512, 512); 
      bitmap.Render(chart_, t); 
      //texture = new Texture2D(GraphicsDeviceManager.Current.GraphicsDevice, bitmap.PixelWidth, bitmap.PixelHeight, false, SurfaceFormat.Color); 
      //bitmap.CopyTo(texture); 
      image1.Source = bitmap; 
     } 
    } 
} 

そして

<UserControl x:Class="SilverlightApplication1.MainPage" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d" 
    d:DesignHeight="300" d:DesignWidth="400" 
    xmlns:toolkit="http://schemas.microsoft.com/winfx/2006/xaml/presentation/toolkit"> 

    <Grid x:Name="LayoutRoot" Background="White" Loaded="LayoutRoot_Loaded"> 
     <Image Height="150" HorizontalAlignment="Left" Margin="97,109,0,0" Name="image1" Stretch="Fill" VerticalAlignment="Top" Width="200" /> 
    </Grid> 
</UserControl> 

...

が試み回避策のすべてを削除することを忘れないでください - 私はそれらのいずれかが必要であるとは思いません。テクスチャとしなければならなかった私はあなたの例から使用していなかっただけのコード - 私はそれをどのように処理するかを知らなかったし、それはあなたがとにかく持った問題ではありませんでした...

デビッド

+0

助けてくれてありがとうございます。もう一度やり直してください。私はNuGetからChartingパッケージを使ってみましたが、このパッケージではNo Chart(全体グリッドは白です)が得られました。インストールされたSLツールキットから 'System.Windows.Controls.DataVisualization.Toolkit'への参照を使用したとき、Chartはうまく見えますが、生成されたイメージは完全に透明です。 コードを実行しているとき、あなたは何を見ていますか?:) は(PIX!= 0)場合、デバッグ 'foreachの(bitmap.Pixels中のvar PIX) { に整列するあなたにこのコードを追加して、ブレークポイントを追加しよう Debug.WriteLine( "ゼロ以外"); } ' –

0

WriteableBitmapオブジェクト& Renderメソッドを呼び出すと、Chartはまだレンダリングされていないと思います。これをチェックするには、これらのコード行をButton_Clickなどの他のイベントに移動してください。WriteableBitmapを作成する際に以下のコードを見て、ソースとしてイメージコントロールに渡します。背後に....

<UserControl x:Class="TryBitmap.MainPage" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
mc:Ignorable="d" 
d:DesignHeight="300" d:DesignWidth="400" 
xmlns:toolkit="http://schemas.microsoft.com/winfx/2006/xaml/presentation/toolkit"> 
<Grid x:Name="LayoutRoot" Background="White"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="35"/> 
     <RowDefinition/> 
    </Grid.RowDefinitions> 
    <Button Grid.Row="0" Height="25" Width="100" Content="Capture" Click="Button_Click"/> 
    <Grid x:Name="grdGraphs" Grid.Row="1"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition/> 
      <ColumnDefinition/> 
     </Grid.ColumnDefinitions> 
     <Image x:Name="img" Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Center"/> 
    </Grid> 
</Grid> 

コード....

public partial class MainPage : UserControl 
{ 
    private Chart chart_; 

    public MainPage() 
    { 
     InitializeComponent(); 
     Loaded += new RoutedEventHandler(MainPage_Loaded); 
    } 

    void MainPage_Loaded(object sender, RoutedEventArgs e) 
    { 
     var data = new List<Point>(100); 
     for (int i = 0; i < 100; i++) 
     { 
      data.Add(new Point(i, Math.Sin(i * Math.PI/50))); 
     } 

     chart_ = new Chart() 
     { 
      Name = "Chart", 
      Width = 512, 
      Height = 512 
     }; 
     LineSeries line = new LineSeries() 
     { 
      Name = "Line", 
      Title = "test", 
      IndependentValuePath = "X", 
      DependentValuePath = "Y", 
      ItemsSource = data 
     }; 
     chart_.Series.Add(line); 

     chart_.SetValue(Grid.ColumnProperty, 0); 
     grdGraphs.Children.Add(chart_); 
    } 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     var bitmap = new WriteableBitmap((int)(chart_.RenderSize.Width), (int)(chart_.RenderSize.Height)); 
     bitmap.Render(chart_, new MatrixTransform()); 
     bitmap.Invalidate(); 

     img.Source = bitmap; 
    } 
} 
0

私は、これは半分だけの答えになるだろう怖いです。私はあなたの直面する問題を解決することができますが、私は解決できなかった別のもので終わるのではないかと心配しています。

Dispatcher.BeginInvokeへの呼び出しの後にビットマップを作成すると、あなたのビットマップが完全に空白でないことを保証しなければならない、すなわち:満足のいく未満であると

// do stuff with chart_ ... 

Dispatcher.BeginInvoke(() => 
{ 
    bitmap = new WriteableBitmap(512, 512); 
    bitmap.Render(chart_, null); 
    bitmap.Invalidate(); 

    // At this point, the bitmap shouldn't be blank. 
}); 

しかし、この結果は、おそらく。私はあなたのコードを実行し、グラフの残りの部分はそこにあったにもかかわらず、LineSeriesがチャートの画像にないことがわかりました。これは私が0にLineSeriesためControlTemplateの様々なアニメーションの全てDuration Sを設定し、さらにチャートに次のプロパティを設定した後でも、真のまま:

chart_.AnimationSequence = AnimationSequence.Simultaneous; 
    chart_.TransitionDuration = new TimeSpan(0); 

IはDispatcher.BeginInvoke()にさらに呼び出しでWriteableBitmap操作をラップしようとしましたこの後、データポイントがより明確に表示され始めました。しかし、私はこのようなアプローチが問題の正しい解決策であるとは信じられません。

+0

ありがとう、私はそれを試してみましたと私はこれらの行を追加したグラフの初期化の最後に ' chart_.Measure(新しいサイズ(512.00、512.00)); chart_.Arrange(新しいRect(新しいポイント(0.00,0.00)、新しいサイズ(512.00,512.00))); 今、LineSeriesはグラフの画像に表示されますが、そのドットはありません。私の目的。私はビジュアルツリーにチャートを追加したくありません。グラフを生成してアプリケーションのXNA部分のテクスチャとして使用したいだけです。 –

関連する問題