Увеличить, чтобы соответствовать размеру холста в C #? - PullRequest
1 голос
/ 10 февраля 2011

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

11 февраля

Спасибо за ваш ответ, Это было очень полезно, и я могу полностью уменьшить масштаб холста. Проблема, с которой я сталкиваюсь сейчас, заключается в том, что у пользователя есть элементы управления увеличением и уменьшением. Поэтому, если пользователь увеличивает и уменьшает масштаб, а затем пытается увеличить масштаб, чтобы он соответствовал холсту, коэффициент масштабирования будет отключен, мой код будет ниже

Это для основного увеличения и уменьшения на холсте:

    double ScaleRate = 1.2;

    public void buttonZoomIn_Click(object sender, RoutedEventArgs e)
    {
        st.ScaleX *= ScaleRate;
        st.ScaleY *= ScaleRate;
    }

    public void buttonZoomOut_Click(object sender, RoutedEventArgs e)
    {
        st.ScaleX /= ScaleRate;
        st.ScaleY /= ScaleRate;
    }

Кнопка увеличения до размера, которую я хочу нажать, чтобы полностью уменьшить масштаб на холсте:

private void zoomToFitBt_Click(object sender, RoutedEventArgs e)
    {
        float maxWidthScale = (float)ScrollViewerCanvas.Width / (float)Canvas1.Width;
        float maxHeightScale = (float)ScrollViewerCanvas.Height / (float)Canvas1.Height;
        float scale = Math.Min(maxHeightScale, maxWidthScale);

        if (st.ScaleX > scale || st.ScaleY> scale)
        {
            st.ScaleX *= scale;
            st.ScaleY *= scale;
        }
    }

Если я нажимаю кнопку увеличения, чтобы подогнать кнопку с самого начала, то это нормально, но когда пользователь сделал какое-то ручное масштабирование, он испортился. Моя идея заключалась в том, чтобы, возможно, каждый раз, когда пользователь нажимал кнопку увеличения для подгонки, он сначала возвращался в исходное состояние, а затем использовал увеличение для подбора кода, но не был уверен в этом.

Спасибо за вашу помощь, ребята

1 Ответ

3 голосов
/ 10 февраля 2011

На основании того небольшого количества информации, которое я приведу, я упросту вашу задачу до того, что, по моим оценкам, вы спрашиваете на самом базовом математическом уровне. Я думаю, что вы спрашиваете ...

"У меня есть 2 прямоугольника (окно просмотра, и холст). Как мне масштабировать холст такой, что он такой же большой, как возможно без превышения ширины или высота окна просмотра. "

этот код определяет, как масштабировать прямоугольник таким образом, чтобы он едва помещался внутри другого прямоугольника.

Rectangle c = new Rectangle(0, 0, 200, 100); //Canvas Rectancle (assume 200x100)
Rectangle v = new Rectangle(0, 0, 50, 50); //Viewport Rectangle (assume 50x50)

//The maximum scale width we could use
float maxWidthScale = (float)v.Width / (float)c.Width; 

//The maximum scale height we could use
float maxHeightScale = (float)v.Height / (float)c.Height; 

//Use the smaller of the 2 scales for the scaling
float scale = Math.Min(maxHeightScale, maxWidthScale); 
* Масштаб

= .25 (или 25%), чтобы соответствовать прямоугольникам образца.

...