StackPanel 实现从上往下+从右往左 排列+RenderTransform特效实例分析

article/2025/10/15 20:17:05

StackPanel:将子元素排列到可沿水平或垂直放置的行。

参考资料:

1. StackPanel类

2. Silverlight学习笔记(九)——RenderTransform特效【五种基本变换】及【矩阵变换MatrixTransform】

3. MatrixTransform矩阵变换

stack表明StackPanel跟栈一样,按顺序压入。StackPanel排列方向分为水平竖直,由Orientation设置,Horizontal(水平)或Vertical(竖直)。如下例所示:

<Grid><StackPanel Height="326" HorizontalAlignment="Left" Margin="30,25,0,0"Name="sp_1" VerticalAlignment="Top" Width="265"Orientation="Horizontal"/><StackPanel Height="326" HorizontalAlignment="Left" Margin="323,25,0,0" Name="sp_2" VerticalAlignment="Top" Width="265" Orientation="Vertical"/>
</Grid>



动态添加控件:
        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);}}

运行效果:



但是实际开发过程中,我们通常需要从右往左,从下往上,那如何实现呢?

  • 从右往左,好办。只要把StackPanel的FlowDirection属性设置为RightToLeft即可!
  • 从下往上,分为前台后台:

前台如下设置:

<Button Content="4" Canvas.Left="125" Canvas.Top="417" Padding="12"RenderTransformOrigin="0.5,0.5"><Button.RenderTransform><ScaleTransform ScaleX="-1"/></Button.RenderTransform>
</Button>

要是动态添加控件的话,后台如下:

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);}
}
运行结果:




附:RenderTransform(System.Windows.UIElement)特效

  • TranslateTransform  —— 平面位移变换
  • RotationTransform   —— 旋转变换
  • ScaleTransform      —— 缩放变换
  • SkewTransform       —— 扭曲变换
  • TransformGrop       —— 组合(组合上述变换效果)变换
  • MatrixTransform     —— 通过矩阵法算实现复杂变换

1.TranslateTransform

        <Canvas Name="canvas_main" Background="Transparent"><Label Name="lb_1" Content="After Change" Width="200" Height="45"HorizontalAlignment="Left" VerticalAlignment="Top"FontSize="17" Canvas.Left="0" Canvas.Top="0" Padding="6"BorderBrush="LightBlue" BorderThickness="2"><Label.RenderTransform><TranslateTransform X="50" Y="80"/></Label.RenderTransform></Label><Label Name="lb_2" Content="Before Change"  Width="200" Height="45" HorizontalAlignment="Left" VerticalAlignment="Top"FontSize="17" Canvas.Left="0" Canvas.Top="0" Padding="6"BorderBrush="LightBlue" BorderThickness="2"></Label></Canvas>
运行效果:



2.RotationTransform

<Label.RenderTransform><RotateTransform CenterX="200" CenterY="45" Angle="180"/>
</Label.RenderTransform>
CenterX和CenterY来设置旋转的中心点。这里定为矩形的右下角为旋转点,顺时针旋转180°。



3.ScaleTransform

<Label.RenderTransform><ScaleTransform CenterX="0" CenterY="0" ScaleX="2" ScaleY="1"/>
</Label.RenderTransform>

上面的例子,我发现。如果只改变ScaleX(1是正常状态),ScaleY保持1不变。此时,无论CenterY为何值,都没有影响。由此可见CenterX指定横向拉伸的基准点,这里是X=0这条直线,向右扩张2倍(如果ScaleX为负值,则向左扩张)。同理CenterY指定竖向的基准轴。

4.SkewTransform

<Label.RenderTransform><SkewTransform CenterX="-20" CenterY="0" AngleX="0" AngleY="45"/>
</Label.RenderTransform>

这里,(CenterX,CenterY)=(-20,0)指定了中心点。AngleY=45°,绕Y轴旋转45°,注意此时不是绕X=0旋转,而是绕X=-20旋转。所以在不绕X轴(也就是说AngleX固定)时,改变CenterY不会有影响。和Scale相反。

5.TransformGrop

以上四种变换要是想组合起来使用,就可以用TransformGroup组合起来,否则会报错。

<Label.RenderTransform><TransformGroup><TranslateTransform X="-200" Y="-45"/><ScaleTransform CenterX="100" CenterY="22.5" ScaleX="-1" ScaleY="-1"/></TransformGroup>
</Label.RenderTransform>


6. MatrixTransform

有六个值:

{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)代入:


根据这个公式,我们可以从底层来实现上面几个平移、选择、扭曲的功能。

平移:


<Label.RenderTransform><MatrixTransform  Matrix="1,0,0,1,80,30"/>
</Label.RenderTransform>


结论:OffsetX和OffsetY控制水平和竖直方向的偏移。

拉伸:


x方向拉伸了1倍。

<MatrixTransform  Matrix="2,0,0,1,0,0"/>


结论:M11控制X方向的伸缩,M22控制Y方向的伸缩。


旋转:

90度旋转:

例如,现在有点(x,y),要求选择90度:


两个向量垂直,则向量积为0,得:


那么究竟M12=1,M21=-1还是M12=-1,M21=1呢?这取决于顺时针旋转还是逆时针旋转。这里M12=1是顺时针,反之为逆时针。

<MatrixTransform  Matrix="0,-1,1,0,155,200"/>

这里逆时针旋转90度后,加上Offset后,效果如上。加起来的效果就是沿右上角逆时针旋转90度。

结论:如果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)





http://chatgpt.dhexx.cn/article/ZdDOfEOK.shtml

相关文章

控件篇 - 子控件在StackPanel里的居中问题

如下面代码&#xff1a; <StackPanel Width"200" Height"80" Background"Tomato"><TextBlock HorizontalAlignment"Center" VerticalAlignment"Center" Text"ABCD"/></StackPanel> 原意是想通…

Docker Stack

大规模场景下的多服务部署和管理是一件很难的事情。Docker Stack 为解决该问题而生&#xff0c;Docker Stack 通过提供期望状态、滚动升级、简单易用、扩缩容、健康检查等特性简化了应用的管理&#xff0c;这些功能都封装在一个完美的声明式模型当中。 Stack 能够在单个声明文…

StackPanel布局

StackPanel可以把内部元素在纵向或横向上紧凑排列&#xff0c;形成栈式布局。 示例代码&#xff1a; <Grid><GroupBox Header"请选择没有错别字的成语" BorderBrush"Black" Margin"5"><StackPanel Margin"5" Heig…

2.12 Stack

2.12 Stack Stack也是List接口的实现类之一&#xff0c;和Vector一样&#xff0c;因为性能原因&#xff0c;更主要在开发过程中很少用到栈这种数据结构&#xff0c;不过栈在计算机底层是一种非常重要的数据结构&#xff0c;下边将探讨下Java中Stack。 2.12.1 Stack的继承关系 …

wpf之StackPanel布局

注意两个参数&#xff1a; Orientation &#xff1a;控制排列是水平方向&#xff0c;还是垂直方向&#xff08;Horizontal 水平方向 Vertical垂直方向&#xff09; FlowDirection&#xff1a;控制控件排序是从右往左还是从左往右&#xff0c;写两个简单的demo如下&#xff…

四、StackPanel控件

StackPanel可以把内部控件在纵向或横向上紧凑排列、形成栈式布局&#xff0c;当上层控件不被删除时&#xff0c;剩余的控件会前移&#xff0c;填充空白 特点&#xff1a; 同类控件紧凑排列移除其中…

WPF 控制StackPanel用法

StackPanel是非常相似的WrapPanel&#xff0c;但至少有一个重要的区别&#xff1a;StackPanel的不换行的内容。相反&#xff0c;它将内容向一个方向拉伸&#xff0c;允许您将一项一项一项地堆叠在一起。让我们首先尝试一个非常简单的示例&#xff0c;就像我们对 WrapPanel 所做…

2021-08-16 WPF控件专题 StackPanel 控件详解

1.StackPanel 控件介绍 堆栈面板 —布局控件 —Panel 子元素排列成一行或一列 水平 垂直 FlowDirection 子元素的流动方向 Orientation&#xff1a;Horizontal 一行 一般设置VerticalAlignment&#xff1a;Top Bottom Center Stretch Vertical 一列 HorizontalAlignment Left…

WPF中StackPanel的尺寸的怪癖

前几天写了文章&#xff1a;WPF中的DataGrid控件的VerticalScrollBarVisibility属性失效 今天继续补充StackPanel的特点&#xff0c;可以作为对上述文章的进一步解释。 在WPF中&#xff0c;StackPanel是十分常用的布局元素。然而&#xff0c;该元素和很多其它元素不同&#x…

StackPanel

原文链接&#xff1a;http://www.cnblogs.com/Jennifer/articles/1987757.html Canvas、StackPanel、WrapPanel、DockPanel和Grid是WPF中主要的5种内建面板&#xff0c;这些面板类都位于System.Windows.Controls命名空间下。 StackPanel是一个受欢迎的面板&#xff0c;因为它方…

WPF中的StackPanel、WrapPanel、DockPanel

一、StackPanel StackPanel是以堆叠的方式显示其中的控件 1、可以使用Orientation属性更改堆叠的顺序 Orientation"Vertical" 默认&#xff0c;由上到下显示各控件。控件在未定义的前提下&#xff0c;宽度为StackPanel的宽度&#xff0c;高度自动适应控件中内容的高…

WPF布局控件之StackPanel

StackPanel Stack&#xff0c;英文意思是堆栈&#xff0c;StackPanel&#xff0c;意思是堆栈式布局&#xff0c;相当于把控件给堆起来。如果不设置StackPanel中控件的宽高&#xff0c;那么其中控件的宽高是默认和StackPanel一样的&#xff0c;如果设置控件宽高&#xff0c;那么…

WPF-StackPanel面板

StackPanel Orientation属性 Orientation属性决定SatckPanel中元素的排列方向&#xff0c;默认为垂直排列 Orientation“Vertical” <Window x:Class"StackPanel.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:…

WPF之路——StackPanel布局(堆栈面板)

StackPanel是一个受欢迎的面板&#xff0c;因为它方便好用&#xff0c;它会顺序对它的子元素进行排列。它是少数几个没有定义任何附加属性的面板之一。由于没有附加属性来排列子元素&#xff0c;只有一种方法可以定制StackPanel的行为——设置Orientation属性为Horizontal或Ver…

解决StackPanel滚动条无法显示

解决StackPanel滚动条无法显示 解决方法 1.添加容器:xtraScrollableControl 2.StackPanel隐藏属性 StackPanel.AutoScroll true (设计界面StackPanel控件无法找到该属性&#xff0c;代码设置) 配个显示效果图

ITS堆栈

ITS堆栈 1. ITS堆栈 - 参考体系结构2. C-V2X 重用汽车行业定义的上层3. C-V2X – DSRC 协议栈比较4. V2X 堆栈的演变&#xff08;欧盟版&#xff09;5. 802.11 和 IEEE 1609.X 规范6. 常见的 ITS 消息7. SAE International J2735 消息&#xff1a;示例8. ETSI CAM/DENM 消息&am…

布局之WrapPanel与StackPanel

布局之WrapPanel与StackPanel 一、WrapPanel WrapPanel布局面板将各个控件从左至右按照行或列的顺序罗列&#xff0c;当长度或高度不够是就会自动调整进行换行&#xff0c;后续排序按照从上至下或从右至左的顺序进行。 Orientation——根据内容自动换行。当Horizontal选项看…

布局之StackPanel面板

应用程序界面设计中,合理的元素布局至关重要,它可以方便用户使用,并将信息清晰合理地展现给用户。WPF提供了一套功能强大的工具-面板(Panel),来控制用户界面的布局。你可以使用这些面板控件来排布元素。如果内置布局控件不能满足需要的话,还可以创建自定义的布局元素。 面…

WPF布局控件之StackPanel布局

文章目录 前言概述&#xff1a; 一、StackPanelOrientation属性演示代码如下&#xff08;水平排列&#xff09;:效果图如下代码如下&#xff08;垂直排列&#xff09;:效果图如下 Background属性演示代码如下效果如下 HorizontalAlignment属性演示代码如下&#xff08;水平靠右…

堆叠 stack

堆叠 堆叠是指将多台支持堆叠特性的交换机通过堆叠线缆连接在一起&#xff0c;从逻辑上变成一台交换设备&#xff0c;作为一个整体参与数据转发 主交换机&#xff08;Master&#xff09; 主交换机负责管理整个堆叠。堆叠系统中只有一台主交换机。备交换机&#xff08;Standby…