0

在我的 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 实例的线(使用数据绑定)绑定到这些起点和终点。
在窗口的另一部分有一个滑块,它应该代表应用程序的比例值。现在我想要这种行为,以便当我拖动比例滑块时,线条应该根据滑块的值进行缩放。我怎样才能做到这一点?

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

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

但是我有两个问题:1)我从哪里得到“比例”值?Line 类不知道 MainWindow 或 Slider。2)我设法使用糟糕的编程风格(使用静态公共“currentSlider”属性)从滑块中获取“比例”值,如下所示:

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

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

那么如何使线条根据 Slider 的值进行缩放呢?

4

2 回答 2

1

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

另一种方法是使用带有 LineGeometry 的路径。由于 LineGeometry 有一个StartPoint和 一个EndPoint属性,而不是 Line 类的、X1和,但是您可以使用绑定转换器,或者将您的项目类更改为如下所示:Y1X2Y2

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

在您的 ItemsControl 中,您现在将绑定 LineGeometryStartPointEndPoint属性,并将 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"/>
于 2013-08-06T18:12:05.313 回答
0

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

于 2013-08-06T15:41:17.440 回答