Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > WPF и Silverlight > Масштабирование изображения нарисованного н Canvas


Автор: albert21 23.12.2008, 18:49
Всем привет.

У меня возникла необходимость отобразить на одном "холсте" несколько изображений, одно на другом (короче карта с жирнами точками, которыми отмечены города). В MSDN решения этой задачи:

1) С использованием <DrawingGroup>;    -- (при этом способе возникли проблемы с отслеживанием клика по "городу")
2) С использованием класса DrawingVisual
    Привожу ключемые моменты 2 способа

Код

<Window x:Class="WpfMap.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300" Name="MainWindow" Loaded="WindowLoaded">
    <Grid>
        
        <Canvas Name="[color=orangered]map[/color]">           
        </Canvas>

    </Grid>
</Window>


Код

    public partial class Window1 : Window
    {
        ArrayList hitResultsList = new ArrayList();
        public Window1()
        {
            InitializeComponent();
        }

        private void WindowLoaded(object sender, EventArgs e)
        {
            MyVisualHost visualHost = new MyVisualHost();
            map.Children.Add(visualHost);           /[color=orangered]/тип map - Convas[/color]
        }
    }

        public class MyVisualHost : FrameworkElement
        {
            // Create a collection of child visual objects.
            private VisualCollection _children;

            public MyVisualHost()
            {
                _children = new VisualCollection(this);
                _children.Add(CreateDrawingImageMap());
               //здесь вызываются методы для добавления других элементов "сложного изображения"

            }

            private DrawingVisual CreateDrawingImageMap()
            {
                DrawingVisual drawingVisual = new DrawingVisual();
                DrawingContext drawingContext = drawingVisual.RenderOpen();
                Uri uri = new Uri(@"D:/Temp/WPF/WpfMap/WpfMap/mydata/russia_map.jpg", UriKind.RelativeOrAbsolute);
                BitmapSource src = new BitmapImage(uri);

                drawingContext.DrawImage(src, new Rect(0, 0, 3339, 2154));
                drawingContext.Close();

                return drawingVisual;
            }

            protected override int VisualChildrenCount
            {
                get { return _children.Count; }
            }

            // Provide a required override for the GetVisualChild method.
            protected override Visual GetVisualChild(int index)
            {
                if (index < 0 || index > _children.Count)
                {
                    throw new ArgumentOutOfRangeException();
                }

                return _children[index];
            }
        }



Картинка отображается, но её размер больше размера окна. Как масштабировать изображение построенное на объекте типа Convas???Увеличивать выбранные "мышкой" участки картинки???

Возможно подскажите лучший способ решения этой задачи

Автор: Partizan 23.12.2008, 21:14
albert21, RenderTransform/ScaleTransform

Автор: albert21 23.12.2008, 21:53
Большущее спасибо!!!

Я вот до просмотра ответа партизана такой "извращённый" способ масштабирования (не увеличения) нащупал. Делает скорее всего тоже самое что и ScaleTransform, только опосредованно

Код

            private DrawingVisual CreateDrawingImageMap()
            {
                DrawingVisual drawingVisual = new DrawingVisual();
                DrawingContext drawingContext = drawingVisual.RenderOpen();
                Uri uri = new Uri(@"D:/Temp/WPF/WpfMap/WpfMap/mydata/russia_map.jpg", UriKind.RelativeOrAbsolute);
                BitmapSource src = new BitmapImage(uri);

                ImageBrush brush = new ImageBrush(src);
                drawingContext.DrawRectangle(brush, (Pen)null, new Rect(0, 0, ширина окна , высота окна));
                
                drawingContext.Close();
                return drawingVisual;

            }


Может пригодится для кому-нибудь для чего-нибудь

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)