none
Увеличение содержимого от курсора мыши RRS feed

  • Вопрос

  • У меня WPF 

    Вот разобравшись с ViewBox и ScroolView - как можно сделать увеличение или уменьшение картинки в месте расположения курсора мыши. Типа 2Gis работы. Ну или приближения или уменьшения карт в том же Bing. Понятно что сначала вычислять координаты мыши, а потом?

Ответы

  • Ну как вариант, вы можете применить ScalarTransform. Вот пример увеличения компонента перед сохранением в виде картинки в файл:

    private static void SaveUIElementAsPNG(UIElement elem, double zoomRatio, string fileName)

    {

    Transform prevT = elem.RenderTransform;

    elem.RenderTransform = new ScaleTransform(zoomRatio, zoomRatio);

    elem.UpdateLayout();

    int width = Convert.ToInt32(elem.RenderSize.Width);

    int ht = Convert.ToInt32(elem.RenderSize.Height);

    RenderTargetBitmap rtb = new RenderTargetBitmap(width, ht, 100, 100, PixelFormats.Default);

    rtb.Render(elem);

    PngBitmapEncoder encoder = new PngBitmapEncoder();

    encoder.Frames.Add(BitmapFrame.Create(rtb));

    using (System.IO.FileStream fs = new System.IO.FileStream(fileName, System.IO.FileMode.Create))

    {

    encoder.Save(fs);

    }

    elem.RenderTransform = prevT;

    }


    Взято здесь. Вам нужны первые 3 строки.

    Отвечающий

Все ответы

  • Ну как вариант, вы можете применить ScalarTransform. Вот пример увеличения компонента перед сохранением в виде картинки в файл:

    private static void SaveUIElementAsPNG(UIElement elem, double zoomRatio, string fileName)

    {

    Transform prevT = elem.RenderTransform;

    elem.RenderTransform = new ScaleTransform(zoomRatio, zoomRatio);

    elem.UpdateLayout();

    int width = Convert.ToInt32(elem.RenderSize.Width);

    int ht = Convert.ToInt32(elem.RenderSize.Height);

    RenderTargetBitmap rtb = new RenderTargetBitmap(width, ht, 100, 100, PixelFormats.Default);

    rtb.Render(elem);

    PngBitmapEncoder encoder = new PngBitmapEncoder();

    encoder.Frames.Add(BitmapFrame.Create(rtb));

    using (System.IO.FileStream fs = new System.IO.FileStream(fileName, System.IO.FileMode.Create))

    {

    encoder.Save(fs);

    }

    elem.RenderTransform = prevT;

    }


    Взято здесь. Вам нужны первые 3 строки.

    Отвечающий
  • Алексей этот топик является продолжением данной темы и отвечая там, я честно сказать не подумал о ScalarTransform. Сейчас попробовал переписать тот тестовый проект, но с использованием ScalarTransform и вот какая проблема - ScrollViewer не обращает внимание на масштабирование и линейки прокрути не активируются при выходе вложенных элементов за края.

    Я со ScalarTransform мало сталкивался и может чего не знаю... Тут либо решать эту проблему, либо дорабатывать вариант рассмотренный в вышеуказанном топике. Второе делать пока не стану, подожду вашего ответа.


    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    Отвечающий
  • Я, если честно, со ScalarTransform тоже не работал, просто помнил, что он там где то есть. Ну и сегодня нашел пример. Чтобы появлялись полосы прокрутки, видимо придется делать контрол в контроле, для внешнего увеличивать Width и Height, а к внутреннему применять ScalarTransform. И все это должно быть пропорционально... Так что даже и не знаю что будет проще...
    Отвечающий