0

キャンバス内のイメージ コントロールに機械を表示する C#4.0/WPF でアプリを作成しています。ユーザーは、色付きのテキスト ブロックを画像にドラッグして、摩耗や損傷の領域を示します (ユーザーがドラッグすると、新しいテキスト ブロックを作成して移動するコードを作成しました)。ユーザーがキャンバス上でテキスト ブロックのドラッグを完​​了したら、私の目的は、背景とテキスト ブロックをビットマップにキャプチャして、レポートに送信することです。問題は、これを実行しようとすると、キャプチャされた画像にドラッグされたテキスト ブロックのみが表示され、背景が表示されないことです。私にはまったく同じコードのように見えるテスト プロジェクトが作成され、すべての内容が完全にキャンバスに表示されます。テキスト ブロックのドラッグを実行するコードは関連性がないと思うので、テスト プロジェクトには含めていません。ただし、わかりやすくするためにここに含めました。メイン アプリとテスト アプリの両方から関連するコードを含めました。また、メイン アプリとテスト アプリの両方で生成された画像も含めました。私は XAML に熱中しすぎていないので、これに問題があると思われます。テストアプリとメインアプリの両方から画像を投稿しようとしましたが、担当者ポイントが 10 未満であるため、サイトで許可されません! もちろん、ポイントがあればこれを行うことができます。フォームは大きなフォームであり、多くのコードがあるため、フォームにすべての XAML を含めていませんが、必要に応じてこれを行うことができます。運が悪いので、これを他のフォーラムに投稿しました。誰かが助けてくれることを願っています! 多くの感謝、ジェフ、そして長い投稿をお詫びします! 私は XAML に熱中しすぎていないので、これに問題があると思われます。テストアプリとメインアプリの両方から画像を投稿しようとしましたが、担当者ポイントが 10 未満であるため、サイトで許可されません! もちろん、ポイントがあればこれを行うことができます。フォームは大きなフォームであり、多くのコードがあるため、フォームにすべての XAML を含めていませんが、必要に応じてこれを行うことができます。運が悪いので、これを他のフォーラムに投稿しました。誰かが助けてくれることを願っています! 多くの感謝、ジェフ、そして長い投稿をお詫びします! 私は XAML に熱中しすぎていないので、これに問題があると思われます。テストアプリとメインアプリの両方から画像を投稿しようとしましたが、担当者ポイントが 10 未満であるため、サイトで許可されません! もちろん、ポイントがあればこれを行うことができます。フォームは大きなフォームであり、多くのコードがあるため、フォームにすべての XAML を含めていませんが、必要に応じてこれを行うことができます。運が悪いので、これを他のフォーラムに投稿しました。誰かが助けてくれることを願っています! 多くの感謝、ジェフ、そして長い投稿をお詫びします! フォームは大きく、多くのコードがあるため、フォームにすべての XAML を含めたわけではありません。ただし、必要に応じてこれを行うことができます。誰かが助けてくれることを願っています! 多くの感謝、ジェフ、そして長い投稿をお詫びします! フォームは大きく、多くのコードがあるため、フォームにすべての XAML を含めたわけではありません。ただし、必要に応じてこれを行うことができます。誰かが助けてくれることを願っています! 多くの感謝、ジェフ、そして長い投稿をお詫びします!

アプリの XAML をテストします。

<Canvas Name="canvBlade1Image" Margin="33,23,719,6">
<TextBlock Height="15" Name="tblkRed" Width="18" FontSize="11" Background="Red"         Canvas.Left="200" Canvas.Top="444" HorizontalAlignment="Center" TextAlignment="Center" />
<TextBlock Background="Orange" FontSize="11" Height="15" Name="tblkOrange" TextAlignment="Center" Width="18" Canvas.Left="200" Canvas.Top="465" />
<TextBlock Background="Yellow" FontSize="11" Height="15" Name="tblkYellow" TextAlignment="Center" Width="18" Canvas.Left="200" Canvas.Top="486" />
<TextBlock Background="Lime" FontSize="11" Height="15" Name="tblkGreen" TextAlignment="Center" Width="18" Canvas.Left="200" Canvas.Top="508" />
<TextBlock Background="DodgerBlue" FontSize="11" Height="15" Name="tblkGre" TextAlignment="Center" Width="18" Canvas.Left="200" Canvas.Top="528" />
        <Canvas.Background>
              <ImageBrush ImageSource="C:\Users\jeff\documents\blankblade.png" Stretch="Fill"></ImageBrush>
        </Canvas.Background>

テストアプリ C#

private void btnRendertoBitmap_Click(object sender, RoutedEventArgs e)
{
 Transform transform = canvBlade1Image.LayoutTransform;
 canvBlade1Image.LayoutTransform = null;
 Size size = new Size(canvBlade1Image.ActualWidth, canvBlade1Image.ActualHeight);
 canvBlade1Image.Measure(size);
 canvBlade1Image.Arrange(new Rect(size));
 RenderTargetBitmap renderBitmap = new RenderTargetBitmap((int)size.Width, (int)size.Height, 96d, 96d, PixelFormats.Pbgra32);
 renderBitmap.Render(canvBlade1Image);
 using (FileStream outStream = new FileStream(@"C:\Users\jeff\documents\blade.png.", FileMode.Create))
 {
       PngBitmapEncoder encoder = new PngBitmapEncoder();
       encoder.Frames.Add(BitmapFrame.Create(renderBitmap));
       encoder.Save(outStream);
 }

}

![テスト アプリの出力][1]

メイン アプリ XAML

<Canvas Name="canvBlade1Image" Margin="33,23,719,6">
<TextBlock Height="15" Name="tblkRed" Width="18" FontSize="11" Background="Red"           Canvas.Left="200" Canvas.Top="444" HorizontalAlignment="Center" TextAlignment="Center" />
<TextBlock Background="Orange" FontSize="11" Height="15" Name="tblkOrange" TextAlignment="Center" Width="18" Canvas.Left="200" Canvas.Top="465" />
<TextBlock Background="Yellow" FontSize="11" Height="15" Name="tblkYellow" TextAlignment="Center" Width="18" Canvas.Left="200" Canvas.Top="486" />
<TextBlock Background="Lime" FontSize="11" Height="15" Name="tblkGreen" TextAlignment="Center" Width="18" Canvas.Left="200" Canvas.Top="508" />
<TextBlock Background="DodgerBlue" FontSize="11" Height="15" Name="tblkGre" TextAlignment="Center" Width="18" Canvas.Left="200" Canvas.Top="528" />
<Canvas.Background>
    <ImageBrush ImageSource="C:\Users\jeff\documents\blankblade.png" Stretch="Fill"></ImageBrush>
</Canvas.Background>

メインアプリ C#

public bool ExportToPNG()
{
  try
  {
  Transform transform = canvBlade1Image.LayoutTransform;
  canvBlade1Image.LayoutTransform = null;
  Size size = new Size(canvBlade1Image.ActualWidth, canvBlade1Image.ActualHeight);
  canvBlade1Image.Measure(size);
  canvBlade1Image.Arrange(new Rect(size));
  RenderTargetBitmap renderBitmap = new RenderTargetBitmap((int)size.Width, (int)size.Height, 96d, 96d, PixelFormats.Pbgra32);
  renderBitmap.Render(canvBlade1Image);
  using (FileStream outStream = new FileStream(@"C:\Users\jeff\documents\blade.png.", FileMode.Create))
  {
      PngBitmapEncoder encoder = new PngBitmapEncoder();
      encoder.Frames.Add(BitmapFrame.Create(renderBitmap));
      encoder.Save(outStream);
  }
  return true;
  }
  catch (Exception E)
  {
  MessageBox.Show("Error converting blade image" + E);
  return false;
  }
}

![メインアプリ出力][2]

テキストブロックをドラッグするコード

 private void canvBlade1Image_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {                 
        if(doNotAllowNewFault == true && (((System.Windows.Controls.TextBlock)(e.Source)).Text   == "")) 
        {
            return;
        }   
        if (e.Source != canvBlade1Image && e.Source.GetType() == typeof(System.Windows.Controls.TextBlock))
        {
            overlayTextBlockBackgroundBrush = ((System.Windows.Controls.TextBlock)(e.Source)).Background;
            overlayTextBlockTextAlignment = TextAlignment.Center;
            overlayTextBlockFontSize = ((System.Windows.Controls.TextBlock)(e.Source)).FontSize;
            overlayTextBlockText = ((System.Windows.Controls.TextBlock)(e.Source)).Text;
            canvBlade1Image.Children.Remove(sourceTextBlock);
            if(((System.Windows.Controls.TextBlock)(e.Source)).Text !="")
            {
                moveFault = true;
            }
            sourceElementLeft = Canvas.GetLeft((TextBlock)e.Source);
            sourceElementTop = Canvas.GetLeft((TextBlock)e.Source);
            canvBlade1Image.Children.Remove(sourceTextBlock);
            sourceTextBlock = (TextBlock)e.Source;
            mIsDown = true;
            mStartPoint = e.GetPosition(canvBlade1Image);
            e.Handled = true;
        }
    }


private void canvBlade1Image_MouseMove(object sender, MouseEventArgs e)
{
Double actualX = Math.Abs(e.GetPosition(canvBlade1Image).X);
Double startX = mStartPoint.X;
Double actualY = Math.Abs(e.GetPosition(canvBlade1Image).Y);
Double startY = mStartPoint.Y;

if (mIsDown)
{
    if (!mIsDragging)
    {
        DragStarted();
    }
}

if (mIsDragging)
{
    DragMoved();
}
e.Handled = true;
}


private void DragStarted()
{
mIsDragging = true;
sourceElementLeft = Canvas.GetLeft(sourceTextBlock);
sourceElementTop = Canvas.GetTop(sourceTextBlock);
overlayTextBlock = new TextBlock();
overlayTextBlock.Background = sourceTextBlock.Background;
overlayTextBlock.Width = sourceTextBlock.RenderSize.Width;
overlayTextBlock.Height = sourceTextBlock.RenderSize.Height;
if (moveFault == false)
{
      overlayTextBlock.Text = blade1FaultNumber.ToString();
}
else
{
      overlayTextBlock.Text =overlayTextBlockText;
}
overlayTextBlock.FontSize = overlayTextBlockFontSize;
overlayTextBlock.TextAlignment = overlayTextBlockTextAlignment;
canvBlade1Image.Children.Add(overlayTextBlock);
overlayTextBlock.Opacity = 1;
}

private void DragMoved()
{
Point currentPosition = Mouse.GetPosition(canvBlade1Image);
double elementLeft = (currentPosition.X - mStartPoint.X) + sourceElementLeft;
double elementTop = (currentPosition.Y - mStartPoint.Y) + sourceElementTop;
Canvas.SetLeft(overlayTextBlock, elementLeft);
Canvas.SetTop(overlayTextBlock, elementTop);
}

private void canvBlade1Image_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
if (mIsDown)
{
    DragFinished(false);
    e.Handled = true;
}
}

private void DragFinished(Boolean cancelled)
{


if (mIsDragging)
{
      if( moveFault)
      {
                canvBlade1Image.Children.Remove(sourceTextBlock);
      }
      else
      {
            Canvas.SetLeft(sourceTextBlock, Canvas.GetLeft(overlayTextBlock));
            Canvas.SetTop(sourceTextBlock, Canvas.GetTop(overlayTextBlock));
            TextBlock replacementTextBlock = new TextBlock();
            Canvas.SetLeft(replacementTextBlock, sourceElementLeft);
            Canvas.SetTop(replacementTextBlock, sourceElementTop);
            replacementTextBlock.Height = overlayTextBlock.Height;
            replacementTextBlock.Width = overlayTextBlock.Width;
            replacementTextBlock.Opacity = 1;
            replacementTextBlock.FontSize = 11;
            replacementTextBlock.Background = overlayTextBlock.Background;
            blade1FaultNumber++;
            canvBlade1Image.Children.Add(replacementTextBlock);
      }
          moveFault = false;
          overlayTextBlock = null;
          mIsDragging = false;
          mIsDown = false;
          txtFaultBriefDesciption1.IsEnabled = true;
          txtFaultdetails1.IsEnabled = true;
          cboMeters1.IsEnabled = true;

}
}
4

2 に答える 2

0

多くの欲求不満の後、私は今この問題を解決することができました。成功したテストアプリとまったく同じコードで、prodアプリで背景がレンダリングされなかった理由を見つけることができませんでした。したがって、背景を明示的にレンダリングする新しいルートを試しました。これはうまくいきました、以下のコード:

       try
          {
              RenderTargetBitmap renderBitmap = new RenderTargetBitmap(
              (int)canvBlade1Image.ActualWidth,(int)canvBlade1Image.ActualHeight,96d,
              96d, PixelFormats.Pbgra32);

              DrawingVisual drawingVisual = new DrawingVisual();
              using (DrawingContext drawingContext = drawingVisual.RenderOpen())
                  drawingContext.DrawRectangle(canvBlade1Image.Background, null, new Rect(0, 0, canvBlade1Image.ActualWidth, canvBlade1Image.ActualHeight));
              renderBitmap.Render(drawingVisual);
              renderBitmap.Render(canvBlade1Image);

              using (FileStream outStream = new FileStream(@"C:\Images\Keep\img1.png.", FileMode.Create))
              {
                  PngBitmapEncoder encoder = new PngBitmapEncoder();
                  encoder.Frames.Add(BitmapFrame.Create(renderBitmap));
                  encoder.Save(outStream);
              }
          }
于 2013-01-30T12:23:04.720 に答える