按比例缩放两个画布

时间:2010-08-17 18:25:20

标签: c# wpf

我正在考虑按比例缩放两个面板的最佳方法。

如果我有一个包含两个画布的网格,两个画布彼此水平堆叠,我希望画布(A)按比例缩放到画布(B)的大小。

因此,基本上,如果canvas(B)的大小增加,canvas(A)会减少,如果canvas(A)增加,canvas(B)会减少。

我正在考虑使用转换器来做这件事,但想知道是否有人有任何好主意。

以下是演示所需行为的链接。请参阅屏幕右下角的平移/缩放控制。该控件代表主屏幕的预览。如果按下平移/缩放控制中的变焦按钮,主屏幕将放大,平移/缩放控制中的矩形“平移”区域会减小。

http://quince.infragistics.com/#/Search/ViewPattern $图案=按钮+群体/ PatternExamples $ GUID = 289a497a-6632-455a-87b6-74ee70c2d3be

谢谢!

克里斯

2 个答案:

答案 0 :(得分:2)

转换器可能是最好的方式。您也可以使用RenderTransform.ScaleX / ScaleY而不是调整画布的高度/宽度。

答案 1 :(得分:0)

这是绑定到属性的示例。不确定它是否比转换器更好。

<Canvas Background="Blue">
    <Canvas x:Name="canvas1" ClipToBounds="True" Background="Red" Width="100" Height="100">
        <Canvas.RenderTransform>
            <ScaleTransform ScaleX="{Binding ElementName=slider, Path=Value}" ScaleY="{Binding ElementName=slider, Path=Value}"/>
        </Canvas.RenderTransform>
   </Canvas>

    <Canvas x:Name="canvas2" ClipToBounds="True" Background="Green" Grid.Column="2" Height="100" Width="100" Canvas.Left="200">
        <Canvas.RenderTransform>
            <ScaleTransform ScaleX="{Binding ScaleValue2}" ScaleY="{Binding ScaleValue2}"/>
        </Canvas.RenderTransform>
    </Canvas>
    <Slider x:Name="slider" Canvas.Top="200" Width="200" Value="{Binding Path=ScaleValue, Mode=TwoWay}" Maximum="2"></Slider>
</Canvas>

代码:

public partial class Window1 : Window, INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    public Window1()
    {
        InitializeComponent();
        this.DataContext = this;
    }

    private void NotifyPropertyChanged(String info)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(info));
        }
    }

    private double scaleValue = 1;
    public double ScaleValue
    {
        get
        {
            return scaleValue;
        }
        set
        {
            scaleValue = value;
            NotifyPropertyChanged("ScaleValue");
            NotifyPropertyChanged("ScaleValue2");
        }
    }

    public double ScaleValue2
    {
        get
        {
            return slider.Maximum - ScaleValue;
        }
    }
}