追加する必要がありtextBlocksグループのボックスなアドバイスがある場合はデータの読み込みグラフで制御

StackOverflow https://stackoverflow.com/questions/1699116

  •  18-09-2019
  •  | 
  •  

質問

私の作成、グラフ。うになっているの追加x軸、左y軸、右y軸タリーラベルとは思 追加テキストブロックの各タリーマークの値の関連性を有するタリーマークです。

がって負荷データ形式のデータベースの再描画のtextbolcksもリフレッシュのグラフ表示領域までは除去できないのtextblocksいのグラフ表示されなくなります。

この問題を克服するためにこうと思い入れのテキストブロック側のグループのボックスの場合グラフの区画が再描画を削除するグループボックスの要素とします。

このアプローチして正しいですか。方法を教えてください入れの要素にwindowsのコードの後ろ。やったら教えてくださいその他その他のソリューションは私の問題です。

について rangana.

役に立ちましたか?

解決

にコンポーネントのラインナップがあり多様なソリューションです。について論する上でのソリューション問題について説明していただけまとません。決めることができる作業に最適です。

解決法1:使用TextBlockオブジェクトdisplyラベル

るように聞こえるよい Canvas とん追加 TextBlock にそのtickマークです。これは実行可能な解の場合の性能でしかできない重要なことができません利用データに結合する。

方法が二つありますのTextBlocksこの場合:

  1. に保つことができ List<TextBlock> を通して直接受取人か、あるいはTextblocksリストのTextBlocks作成した最後の時間を作成した。きを再現、ラベルの実行を通じてこのリストを取り外しTextBlockのリストからを含むパネルを、キャンバス)

  2. を作成できます新しいキャンバスのTextBlocksで削除しのキャンバスだとrelabel.

ここでは例の手法では多少の効率化:

class MyGraphBuilder
{
  Canvas _labelCanvas;
  ...
  void AddLabels()
  {
    // Remove old label canvas, if any
    if(_labelCanvas!=null)
      _graphCanvas.Children.Remove(_labelCanvas);

    // Add new label canvas
    _labelCanvas = new Canvas();
    _graphCanvas.Children.Add(_labelCanvas);

    // Create labels
    foreach(...)
    {
      ...
      _labelCanvas.Add(new TextBlock ...
    }
    ...

  }
}

解決法2:データ結合

にコンポーネントのラインナップを作成できます多くのグラフを書かずに、日本国内のスタートアップ!コンポーネントのラインナップ内蔵のデータを結合するのに十分な作り比較的複雑なバーチャートなど。

こちらではの使用例データとの結合をリキッドファンデーション表:

<ItemsControl ItemsSource="{Binding myData}">
  <ItemsControl.ItemTemplate>
    <DataTemplate>
      <DockPanel>
        <TextBlock Width="50" Text="{Binding Label}"/>
        <Rectangle VerticalAlignment="{Stretch}" Width="{Binding Value}">
          <Rectangle.LayoutTransform>
            <ScaleTransform ScaleX="10" /> <!-- Scale factor here, can be binding too -->
          </Rectangle.LayoutTransform>
        </Rectangle>
        <TextBlock Text="{Binding Value}" FontSize="8"/>
      </DockPanel>
    </DataTemplate>
  </ItemsControl.ItemTemplate>
</ItemsControl>

数値ラベルを加えることができます横軸による第二ItemsControlり横方向にそのデータをテンプレート固定幅を示す数字と、tickマーク。

解決3:低レベルの描画の授業

をグラフによる構築 DrawingGroup オブジェクトの追加 GeometryDrawingGlyphRunDrawing オブジェクトで、その DrawingGroup 内部 DrawingVisual 追加することを主 Panel.

のものを使用できる一 GeometryDrawing または GlyphRunDrawing 各項目のセットを共有したブラシやペンでも。たとえば、ご軸の目盛はすべて同じ色、幅、単一の GeometryDrawing 全てただし、各クマークはdiffernet色を複数作成し GeometryDrawing オブジェクト。

まを Geometry オブジェクトのための各 GeometryDrawing.最高の効率であるべき StreamGeometry, が、その他の形状の授業も仕事でも、より使いやすく、初期化にー.の作成 PathGeometry または EllipseGeometry ってfamilarまでして行きたいと思っていを StreamGeometry.これを呼び出しの Open の方法について using() 決して書面で返されたコンテキスト以下に例を示します。

Geometry BuildAxesAndTicksGeometry()
{
  // First create geometry
  var geometry = new StreamGeometry();
  using(var context = geometry.Open())
  {
    // Horizontal axis
    context.BeginFigure(new Point(0,0), false, false);
    context.LineTo(new Point(_width, 0), true, false);

    // Vertical axis
    context.BeginFigure(new Point(0,0), false, false);
    context.LineTo(new Point(0, _height), true, false);

    // Horizontal ticks
    for(int i=0; i<_nTicksHorizontal; i++)
    {
      context.BeginFiture(new Point(i * _tickSpacing, -10), false, false);
      context.LineTo(new Point(i * _tickSpacing, 10), true, false);
    }
    // Do same for vertical ticks
  }

  // Now add it to a drawing
  return new GeometryDrawing { Geometry = geometry, Stroke = _axisPen };
}

Drawing BuildDrawing()
{
  var mainDrawing = new DrawingGroup();
  mainDrawing.Add(BuildAxesAndTicksGeometry());
  ... // Add other drawings, including one or more for the data
  return mainDrawing;
}

void UpdateDrawing()
{
  myDrawingVisual.Drawing = BuildDrawing();  // where myDrawingVisual is defined in the XAML
}

の比較解

ほとんどの場合でおすすめ液に2、3、これらの理由

  • 場合、グラフは、利用データを結合します。とソリューション2.
  • 場合、グラフできないデータとの結合を描画オブジェクトは、約とその他の技術で見ることができます。Goソリューション3.

場合とまっいては、既に投資している重要な作業へのソリューション1には、まずはそうしていくべきであるものであろうか最高です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top