在我的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的值来缩放线条?
答案 0 :(得分:1)
问题表明您想要缩放Line的起点和终点,而不是缩放渲染的笔触粗细。因此,您不能简单地将变换应用于DataTemplate中Line的LayoutTransform
或RenderTransform
属性。
另一种方法是使用带有LineGeometry的Path。由于LineGeometry具有StartPoint
和EndPoint
属性,而不是Line类的X1
,Y1
,X2
和Y2
,因此然而,要么使用绑定转换器,要么将您的项类更改为以下内容:
public class Line
{
public Point P1 { get; set; }
public Point P2 { get; set; }
}
在ItemsControl中,您现在将绑定LineGeometry的StartPoint
和EndPoint
属性,并将ScaleTransform放入LineGeometry的Transform
。 ScaleTransform具有ScaleX
和ScaleY
属性,这些属性将绑定到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
对象,您可以选择如何缩放线条,例如。从他们的中心,或从左边或右边等。