OnRender doesn't get called until a visual gets added into a visual tree.
If the goal is to get the image without adding the visual to the visual tree, you can use VisualCollection/DrawingVisual.
Code:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
Canvas canvas = new Canvas();
this.Content = canvas;
canvas.Background = Brushes.Black;
MyImage myimage = new MyImage();
myimage.InvalidateMeasure();
myimage.InvalidateArrange();
myimage.InvalidateVisual();
myimage.UpdateLayout();
canvas.MouseDown += delegate
{
RenderTargetBitmap target = new RenderTargetBitmap(100, 100, 96, 96, PixelFormats.Default);
target.Render(myimage);
ImageBrush brush = new ImageBrush();
brush.ImageSource = target;
canvas.Background = brush;
};
}
}
class MyImage : Image
{
public MyImage()
{
visuals = new VisualCollection(this);
visual = new DrawingVisual();
visuals.Add(visual);
Draw();
}
private void Draw()
{
using (DrawingContext dc = visual.RenderOpen())
dc.DrawRectangle(Brushes.Red, null, new Rect(0, 0, 100, 100));
}
VisualCollection visuals;
DrawingVisual visual;
protected override Visual GetVisualChild(int index)
{
return visuals[index];
}
protected override int VisualChildrenCount
{
get { return visuals.Count; }
}
}
Source:
https://social.msdn.microsoft.com/Forums/en-US/81ccabb8-4f38-46ba-827c-d0a2b66372de/wpf-can-onrender-render-if-a-control-is-not-added-as-child[
^]