私は数日間この問題と戦ってきましたが、解決したり、Web でサポートを見つけたりすることができませんでした。基本的に、ビジュアル要素としてキャンバスを使用して VisualBrush を作成しようとしています。このキャンバスに複数の線を描画できるようにしたいと考えており、最終的には 3D サーフェス (長方形を形成する 2 つの平行な三角形) にマッピングします。テクスチャ座標を設定し、ImageBrush などを使用するだけですべてが機能することを確認できます。私が抱えている問題は、キャンバスがそのサイズを維持することを拒否し、その中のコンテンツに基づいて常にスケーリングされることです. たとえば、キャンバスが 100x100 で、その中に (0, 0) から (50, 50) までの 1 行がある場合、キャンバスは、コンテンツを含む 50x50 の部分のみがテクスチャ座標と 3D サーフェスにマップされるようにスケーリングされます。Viewport/Viewbox/StretchMode/Alignment/etc の多くの組み合わせを試しましたが、これが起こらないようにするものは何も見つかりません。キャンバスの幅と高さのプロパティを設定しているので、グリッドや他のレイアウト コンテナーに単純に追加した場合と、VisualBrush でのパフォーマンスが異なる理由がわかりません。
問題を説明するのに役立つコードを次に示します。
// create the canvas for the VisualBrush
Canvas drawCanvas = new Canvas();
drawCanvas.Background = Brushes.Transparent; // transparent canvas background so only content is rendered
drawCanvas.Width = 100;
drawCanvas.Height = 100;
// add a line to the canvas
Line l = new Line();
l.X1 = 0;
l.Y1 = 0;
l.X2 = 50;
l.Y2 = 50;
l.Stroke = Brushes.Red;
l.StrokeThickness = 2;
drawCanvas.Children.Add(l);
// create rectangular surface mesh
MeshGeometry3D TableMesh = new MeshGeometry3D();
CreateRectangleModel(
new Point3D(0, 0, 0),
new Point3D(0, 0, 100),
new Point3D(100, 0, 100),
TableMesh);
// need to include texture coordinates for our table mesh to map canvas to 3D model
TableMesh.TextureCoordinates = new PointCollection {
new Point(0, 0), new Point(0, 1), new Point(1, 1),
new Point(1, 1), new Point(0, 1), new Point(0, 0),
new Point(1, 1), new Point(1, 0), new Point(0, 0),
new Point(0, 0), new Point(1, 0), new Point(1, 1)
};
// finally make our visual brush with the canvas we have created
VisualBrush vb = new VisualBrush();
vb.Visual = drawCanvas;
Material TableMaterial = new DiffuseMaterial(vb);
// add our new model to the scene
GeometryModel3D geometry = new GeometryModel3D(TableMesh, TableMaterial);
Model3DGroup group = new Model3DGroup();
group.Children.Add(geometry);
ModelVisual3D previewTable = new ModelVisual3D();
previewTable.Content = group;
MainViewport.Children.Add(previewTable);
そして、私が参照した1つの関数は
private void CreateRectangleModel(Point3D pStart, Point3D pCorner1, Point3D pEnd, MeshGeometry3D mesh)
{
// pCorner -> O--O <- pEnd
// | /|
// |/ |
// pStart -> O--O <- pCorner2
// find the remaining point for our rectangle
Point3D pCorner2 = new Point3D(
pStart.X + (pEnd.X - pCorner1.X),
pStart.Y + (pEnd.Y - pCorner1.Y),
pStart.Z + (pEnd.Z - pCorner1.Z));
// add necessary triangles to our group (we create 2 facing up, 2 facing down)
CreateTriangleModel(pStart, pCorner1, pEnd, mesh);
CreateTriangleModel(pEnd, pCorner1, pStart, mesh);
CreateTriangleModel(pEnd, pCorner2, pStart, mesh);
CreateTriangleModel(pStart, pCorner2, pEnd, mesh);
}
子コンテンツがこれらの極限まで行かない限り、キャンバスの設定サイズを 100x100 に維持することはできません。私の目的では、線の座標はキャンバス内のどこにでもある可能性があり、コンテンツに関係なく目的の形状を維持する必要があります。
どんなアドバイスでも大歓迎です!