Как преобразовать ViewBox в ImageSource? - PullRequest
5 голосов
/ 25 октября 2010

Я использую Viewbox для создания набора значков, которые я буду динамически привязывать к представлению WPF.

Я привязываюсь к имени ресурса и использую Converter для преобразования имени ресурса в ImageSource.

Я знаю, как это сделать, если ресурс Path, но как это сделать с Viewbox?

Вот как я преобразую имя ресурса, если ресурс Path, в ImageSource:


public class ResourceNameToImageSourceConverter : BaseValueConverter {
    protected override ImageSource Convert(string value, System.Globalization.CultureInfo culture) {
        var resource = new ResourceDictionary();
        resource.Source = new Uri("pack://application:,,,/MyAssembly;component/MyResourceFolder/ImageResources.xaml", UriKind.Absolute);
        var path = resource[value] as Path;
        if (path != null) {
            var geometry = path.Data;
            var geometryDrawing = new GeometryDrawing();
            geometryDrawing.Geometry = geometry;
            var drawingImage = new DrawingImage(geometryDrawing);</p>

<pre><code>        geometryDrawing.Brush = path.Fill;
        geometryDrawing.Pen = new Pen();

        drawingImage.Freeze();
        return drawingImage;
    } else {
        return null;
    }
}

} И вот как выглядит объявление Viewbox.

<Viewbox>
    <Viewbox>
      <Grid>
        <Path>
        ...
        </Path>
        <Path>
        ...
        </Path>
        <Path>
        ...
        </Path>
        <Rectangle>
        ...
        </Rectangle>
      </Grid>
    </Viewbox>
</Viewbox>
</code>

1 Ответ

0 голосов
/ 04 марта 2011

Viewbox - это визуальный элемент, поэтому вам нужно будет вручную «визуализировать» его в растровое изображение. Этот пост blog показывает, как это делается, но соответствующий код:

private static BitmapSource CaptureScreen(Visual target, double dpiX, double dpiY) {
    if (target == null)
        return null;

    Rect bounds = VisualTreeHelper.GetDescendantBounds(target);
    RenderTargetBitmap rtb = new RenderTargetBitmap((int)(bounds.Width * dpiX / 96.0),
                                                (int)(bounds.Height * dpiY / 96.0),
                                                dpiX,
                                                dpiY,
                                                PixelFormats.Pbgra32);
    DrawingVisual dv = new DrawingVisual();
    using (DrawingContext ctx = dv.RenderOpen()) {
        VisualBrush vb = new VisualBrush(target);
        ctx.DrawRectangle(vb, null, new Rect(new Point(), bounds.Size));
    }

    rtb.Render(dv);
    return rtb;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...