У меня есть большой холст, который я пытаюсь разбивать на страницы для печати. Я могу разделить холст на разделы размера страницы, иметь возможность обрезать (обрезать) содержимое и передавать каждую страницу методу печати. Однако я хочу пропустить пустые страницы, и вам нужно какое-то средство обнаружить, что содержимое пустым.Как определить, если обрезанный/обрезанный WPF FrameworkElement/Canvas имеет какой-либо контент?
В настоящее время я «сплющить» холста путем преобразования его в прямоугольник с визуала оригинала Холст:
public Rectangle createRectanglefromUI(UIElement ui)
{
VisualBrush myVisualBrush = new VisualBrush();
myVisualBrush.Visual = ui;
Rectangle myRectangle = new Rectangle();
double w = ((FrameworkElement)ui).ActualWidth;
double h = ((FrameworkElement)ui).ActualHeight;
double ratio = w/h;
myRectangle.Width = 150;
myRectangle.Height = 150/ratio;
myRectangle.StrokeThickness = 0;
myVisualBrush.Stretch = Stretch.Uniform;
myRectangle.Margin = new Thickness(0, 0, 0, 0);
myRectangle.Fill = myVisualBrush;
return (myRectangle);
}
Я тогда клип полученный прямоугольник, чтобы обрезать его по размеру:
private Canvas cropUIElement(double desiredWidth, double desiredHeight, int leftCoordinate, int topCoordinate, FrameworkElement uiELement, int scaleFactor = 1)
{
try
{
// Create a clip for masking undesired content from the element
Rect clipRectangle = new Rect(leftCoordinate * desiredWidth, topCoordinate * desiredHeight, desiredWidth, desiredHeight);
RectangleGeometry clipGeometry = new RectangleGeometry(clipRectangle);
ScaleTransform clipScale = new ScaleTransform(scaleFactor, scaleFactor, 0, 0);
Rectangle flattenedUIElement = createRectanglefromUI(uiELement);
flattenedUIElement.Clip = clipGeometry;
flattenedUIElement.LayoutTransform = clipScale;
flattenedUIElement.ClipToBounds = true;
Canvas outputElement = new Canvas();
Canvas.SetLeft(
flattenedUIElement, -1 * scaleFactor * (leftCoordinate * desiredWidth));
Canvas.SetTop(
flattenedUIElement, -1 * scaleFactor * (topCoordinate * desiredHeight));
// Configuring width and height determines the final element size.
outputElement.Width = scaleFactor * desiredWidth;
outputElement.Height = scaleFactor * desiredHeight;
outputElement.Children.Add(flattenedUIElement);
// Default behavior is ClipToBounds = false. True creates the cropping effect.
outputElement.ClipToBounds = true;
return outputElement;
}
catch (SystemException)
{
return null;
}
}
Я подумал, что, возможно, я мог бы использовать XamlWriter для анализа полученного обрезанного холста и обнаружения, если что-либо присутствовало, но не знаю, как это сделать. Также может быть целесообразным нарисовать прямоугольник на исходном холсте, представляющий размер целевой страницы, и проверить, не возникли ли какие-либо другие элементы в пределах своих границ/столкновений. Я не уверен. Было бы неплохо получить возвращаемое значение или нуль или что-то еще, мне просто нужно какое-то средство через весь этот путь, чтобы узнать, что у моего обрезанного раздела нет содержимого.