参考资料:
1. StackPanel类
2. Silverlight学习笔记(九)——RenderTransform特效【五种基本变换】及【矩阵变换MatrixTransform】
3. MatrixTransform矩阵变换
stack表明StackPanel跟栈一样,按顺序压入。StackPanel排列方向分为水平竖直,由Orientation设置,Horizontal(水平)或Vertical(竖直)。如下例所示:
private void init_sp_1()
{
for (int i = 0; i < 5; i++)
{
Button btn = new Button();
btn.Background = Brushes.LightCyan;
btn.Width = 20;
btn.Height = (i+1) * 30;
btn.Content = i.ToString();
this.sp_1.Children.Add(btn);
}
}
private void init_sp_2()
{
for (int i = 0; i < 5; i++)
{
Button btn = new Button();
btn.Background = Brushes.LightCyan;
btn.Width = (i + 1) * 30;
btn.Height = 20;
btn.Content = i.ToString();
this.sp_2.Children.Add(btn);
}
}
运行效果:
但是实际开发过程中,我们通常需要从右往左,从下往上,那如何实现呢?
前台如下设置:
private void init_sp_2()
{
for (int i = 0; i < 5; i++)
{
Button btn = new Button();
btn.Background = Brushes.LightCyan;
btn.Width = (i + 1) * 30;
btn.Height = 20;
btn.Content = i.ToString();
ScaleTransform st = new ScaleTransform();
st.ScaleX = -1;
st.CenterX = btn.Width / 2;
st.CenterY = btn.Height / 2;
st.ScaleY = -1;
btn.SetValue(Button.RenderTransformProperty, st);
this.sp_2.Children.Add(btn);
}
}
运行结果:
运行效果:
CenterX和CenterY来设置旋转的中心点。这里定为矩形的右下角为旋转点,顺时针旋转180°。
以上四种变换要是想组合起来使用,就可以用TransformGroup组合起来,否则会报错。
有六个值:
{M11,M12,M21,M22,OffsetX,OffsetY}
看几个例子:
比如现在有一个点(2,5),
这里M11=1,M12=0,M21=0,M22=1,这是它们的默认值,对点的位置没有影响。它们构成这样的一个矩阵:
如果需要位移的话,可以加上偏移OffsetX和OffsetY,于是有这样的公式:
将M11,M12,M21,M22默认值(1,0,0,1)代入:
根据这个公式,我们可以从底层来实现上面几个平移、选择、扭曲的功能。
平移:
结论:OffsetX和OffsetY控制水平和竖直方向的偏移。
拉伸:
x方向拉伸了1倍。
结论:M11控制X方向的伸缩,M22控制Y方向的伸缩。
旋转:
90度旋转:
例如,现在有点(x,y),要求选择90度:
两个向量垂直,则向量积为0,得:
那么究竟M12=1,M21=-1还是M12=-1,M21=1呢?这取决于顺时针旋转还是逆时针旋转。这里M12=1是顺时针,反之为逆时针。
结论:如果Matrix不是按默认值(+-1,0,0,+-1)设置,那么就有可能做旋转操作,几种情况分析如下。
角度 | 原始值 | 顺时针 | 逆时针 |
0 | (x,y) | (x,y)(1,0,0,1) |
同左 |
90 | (x,y) | (y,-x)(0,-1,1,0) | (-y,x)(0,1,-1,0) |
180 | (x,y) |
(-x,-y)(-1,0,0,-1) | 同左 |
270 | (x,y) |
(-y,x)(0,1,-1,0) | (y,-x)(0,-1,1,0) |