2015-12-09 11 views
1

У меня есть большой холст, который я пытаюсь разбивать на страницы для печати. Я могу разделить холст на разделы размера страницы, иметь возможность обрезать (обрезать) содержимое и передавать каждую страницу методу печати. Однако я хочу пропустить пустые страницы, и вам нужно какое-то средство обнаружить, что содержимое пустым.Как определить, если обрезанный/обрезанный 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 для анализа полученного обрезанного холста и обнаружения, если что-либо присутствовало, но не знаю, как это сделать. Также может быть целесообразным нарисовать прямоугольник на исходном холсте, представляющий размер целевой страницы, и проверить, не возникли ли какие-либо другие элементы в пределах своих границ/столкновений. Я не уверен. Было бы неплохо получить возвращаемое значение или нуль или что-то еще, мне просто нужно какое-то средство через весь этот путь, чтобы узнать, что у моего обрезанного раздела нет содержимого.

ответ

0

Это неэффективно, но то, что я закончил, это сравнение обрезанной области (в результате cropUIElement) со всеми дочерними элементами холста, проверка боя .IntersectsWith (child) и .Contains (child). Я в конечном итоге повторяю все элементы много раз, но он работает.