使用Slider值缩放ItemsControl项(行)

时间:2013-08-06 15:23:15

标签: c# wpf slider scale itemscontrol

在我的WPF应用程序(使用C#和Visual Studio创建)中,我有一个ItemsControl;这些项是自定义类Line的实例。 Line类包含该行的x和y坐标:

public class Line{
    private double _x1, _y1, _x2, _y2;
    public double X1{
        get{ return _x1; }
        set{ _x1 = value; }
    }
    public double Y1{
        get{ return _y1; }
        set{ _y1 = value; }
    }
    public double X2{
        get{ return _x2; }
        set{ _x2 = value; }
    }
    public double Y2{
        get{ return _y2; }
        set{ _y2 = value; }
    }
}

表示Line实例的直线(使用数据绑定)绑定到这些起点和终点 在窗口的另一部分有一个Slider,它应该代表应用程序的比例值。现在我想要这样的行为,这样当我拖动标尺Slider时,线条应该根据Slider的值进行缩放。我怎样才能做到这一点?

我试图更改像这样的getter方法:

public double X1{
    get{ return _x1*scale; }
    set{ _x1 = value; }
}

但后来我遇到了两个问题: 1)我从哪里获得“比例”值? Line类不知道MainWindow或Slider。 2)我设法使用错误的编程风格(使用静态公共“currentSlider”属性)从Slider获取“scale”值,如下所示:

public class MainWindow{
    public static Slider currentSlider;
    public MainWindow(){
        InitializeComponents();
        currentSlider = slider1;
    }
}

然后Line类可以访问比例值,并使用正确的比例因子创建新线。但是当我移动滑块时,线条不会更新和缩放。

那么如何根据Slider的值来缩放线条?

2 个答案:

答案 0 :(得分:1)

问题表明您想要缩放Line的起点和终点,而不是缩放渲染的笔触粗细。因此,您不能简单地将变换应用于DataTemplate中Line的LayoutTransformRenderTransform属性。

另一种方法是使用带有LineGeometry的Path。由于LineGeometry具有StartPointEndPoint属性,而不是Line类的X1Y1X2Y2,因此然而,要么使用绑定转换器,要么将您的项类更改为以下内容:

public class Line
{
    public Point P1 { get; set; }
    public Point P2 { get; set; }
}

在ItemsControl中,您现在将绑定LineGeometry的StartPointEndPoint属性,并将ScaleTransform放入LineGeometry的Transform。 ScaleTransform具有ScaleXScaleY属性,这些属性将绑定到Slider的Value

<ItemsControl ItemsSource="{Binding Lines}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <Canvas/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Path Stroke="Black" StrokeThickness="1">
                <Path.Data>
                    <LineGeometry StartPoint="{Binding P1}" EndPoint="{Binding P2}">
                        <LineGeometry.Transform>
                            <ScaleTransform
                                ScaleX="{Binding Value, ElementName=slider}"
                                ScaleY="{Binding Value, ElementName=slider}"/>
                        </LineGeometry.Transform>                                
                    </LineGeometry>
                </Path.Data>
            </Path>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>
...
<Slider x:Name="slider" Width="200" Minimum="1" Maximum="10"/>

答案 1 :(得分:0)

查看MSDN上的ScaleTransform Class页面。使用ScaleTransform对象,您可以选择如何缩放线条,例如。从他们的中心,或从左边或右边等。