相关文章推荐
痴情的领结  ·  c++ - Using ...·  1 年前    · 
痴情的松鼠  ·  基于 SVG Sprites ...·  1 年前    · 

在软件开发中,经常有动态添加控件的需求,并且让控件自动排序,当超过容器的宽度时,自动换行,在Winfrom,Unity 中都有自动布局的组件,WPF应该也有,只是我刚初学,不太清楚。

假如,在一个WPF容器中添加36个控件,每排12个,请问第4个控件和第16个控件,在容器的第几排和第几列?

在编程中遍历数组的习惯性写法,从0开始计数,3则代表4,求余数和它的商就能计算出它在那一排,那一列了。

下面开始求余数,图中这个是网页版的在线求余数计算器,用搜索引擎搜一下就出来了

图一:3 / 12 的商等于 0 代表的是第一排,余数等于 3 代表的是第四列

图二:15 / 12 的商等于 1 代表的是第二排,余数等于 3 代表的是第四列

三、生成界面

知道了这个原理,现在新建一个项目,界面的布局非常简单,代码基本是默认的,可以直接复制下面 MainWindow.xaml 中的代码。

MainWindow.xaml

<Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp1"
        mc:Ignorable="d"
        Title="MainWindow" Height="300" Width="900" Loaded="Window_Loaded">
    <Grid Width="870" Height="96" Background="Pink" Name="MyGrid">
    </Grid>
</Window>

MainWindow.xaml.cs

我设置了一行固定添加12个控件,在这里并没有手动去计算,读者也可以自己实现这些功能,公式是:

X轴能容纳的控件个数 = 容器的宽度  /(控件的宽度 + 间隔距离)----结果取整

Y轴能容纳的控件个数 = 容器的高度  /(控件的高度 + 间隔距离)----结果取整

using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;
namespace WpfApp1
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
        public MainWindow()
            InitializeComponent();
        //代表一行显示多少个控件
        private int CheckBoxCount = 12;
        private void Window_Loaded(object sender, RoutedEventArgs e)
            List<string> allNameList = new List<string>()
              "上官云","上官云","上官云","上官云","上官云","上官云","上官云",
              "上官云","上官云","上官云","上官云","上官云","上官云","上官云",
              "上官云海","上官云海","erss","13e","scced","2edd","246","dfe","df9",
              "8dl","erss","13e","scced","2edd","246","dfe","df9","8dl",
            for (int i = 0; i < allNameList.Count; i++)
                int quotient = i / CheckBoxCount;
                int remainder = i % CheckBoxCount;
                //下面的71是组件的宽度,5 是组件之间的间隔(暂时写死)
                float x = (remainder * 71) + 5;
                float y = (quotient * 25) + 5;
                CheckBox checkbox = new CheckBox();
                checkbox.Name = "CheckBox_" + i;
                checkbox.HorizontalAlignment = System.Windows.HorizontalAlignment.Left;
                checkbox.VerticalAlignment = System.Windows.VerticalAlignment.Top;
                checkbox.Margin = new Thickness(x, y, 0, 0);
                checkbox.Content = allNameList[i];
                //添加到容器中
                this.MyGrid.Children.Add(checkbox);

下面开始运行,看看效果:

 这里效果虽然实现了,但是并没有滚动条,哈哈,暂时先这样了,后面如果有好的方法,我再修改帖子,各位大佬有更好的方法也可以留言告诉我。

如果这个帖子对你有用,欢迎关注 + 点赞 + 留言,谢谢

一、前言在软件开发中,经常有动态添加控件的需求,并且让控件自动排序,当超过容器的宽度时,自动换行,在Winfrom,Unity 中都有自动布局的组件,WPF应该也有,只是我刚初学,不太清楚。二、算法提问:在一个WPF容器中添加36个控件,每排12个,请问第4个控件和第16个控件,在容器的第几排和第几个位置?在编程中遍历数组的习惯性写法,从0开始计数,3则代表4,求余数和它的商就能计算出它在那一排,那一列了。下面开始求余数,图中这个是网页版的在线求余数计算器,用搜索引擎搜一下就出来..
private Transform mTransform; private GameObject gameObject; private Transform spriteTransform; void Awake() mTransform = GetComponent<Transform>(); //创建新物体
这是前台布局代码 <StackPanel Margin="0,50,0,0" Orientation="Horizontal" HorizontalAlignment="Center"> <StackPanel> <Button Content="动态添加多个checkbox控件" Height="20" Padding="15,1,15,2" x:N
wpf自定义控件的位置与window完全不一样啊。。。。。。。。。。。真搞骚。         winform自定义控件位置通过location  如:Button button =new Button();  button.location=new point(x,y);         而wpf的控件自定义位置相对于window来说较为复杂一点。首先将 标签变成
之前的事例中,生成图表都是单一的对Y轴进行赋值,或者X轴与Y轴分开赋值的方法实现。 如果想两个XY组成的列表集,进行赋值,或者同时对X轴Y轴进行赋值来更新曲线,这里分享一种方法。 借助live charts的Mappers来实现数据映射。 1、定义一个类 public class MeasureModel public DateTime DateTime get; set;
最近在项目开发中遇到一个小问题,我们的设备管理模块中有一项叫做“技术参数”,具体来说就是不同的设备具有不同的属性,而且属性的数量也不同。举个例子,桌子有长、宽、高、材质四个属性,日光灯有安装高度、额定功率两个属性。我们希望根据设备类型能够自主添加/修改/删除属性,另一方面其他模块也会用到此功能,所以考虑做一个自定义控件,将增、删、改操作封装在控件内部,数据对外开放。 版本 操作系统
<Canvas x:Name="printArea" Width="680" Height="280" Margin="90,80" Background="Blue"> <Label Content="文本框:" Canvas.Left="10.9" Canvas.Top="20.39" Width="80" Height="30" FontSize="12" Foreground="Black"/> </Canvas>
有个需求,需要为List中的每个Item(List中是基本类型)创建一个TextBlock显示其中的值。如果在Xaml中直接写控件的话,可能不能达到理想的效果(不能使用ItemsControls这样的控件)。那么只能通过程序动态添加。特写此记录。第一种方式:将样式写在Xaml中,或者自定义一个用户控件。 TextBlock tb ...
作者:马路灯出处:博客园 2011/6/30 14:19:51阅读541 次   最近项目需要,使用一个树型控件,其实数据量不大,简单使用一次递归就可以完事,但话说回来,想想,当数据量达到一个量级时,这个方法明显就不足(程序运行十分不给力),而使用节点的深度特性实现加载控制,达到动态生成节点项的目的,这不失为一个好方法。
WPF中,拖拉拽组件动态组态是通过使用第三方库WpfAnimatedGif来实现的。该库提供了功能强大的动态图显示功能,能够在WPF应用程序中显示GIF格式的动态图。你可以搜索一下WpfAnimatedGif这个库以了解更多详情。 在编辑图片时,拖拉、放大缩小、旋转等组态的功能是比较复杂的。你可以使用一个Component类来完成所有移动、放缩、旋转的功能,然后通过继承该类的其他类来指定额外的属性。例如,在选中元件后,你可以使用Component类的方法来实现拉伸拖拉、放大缩小、旋转等操作。这其中,旋转之后的放缩是最复杂的一项功能。 总之,使用WpfAnimatedGif库和Component类,你可以在WPF应用程序中实现拖拉拽组件动态组态的功能,并且可以对图片进行复杂的编辑操作,如移动、放缩、旋转等。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [组态软件的开发(C#)](https://blog.csdn.net/m0_46577050/article/details/123519673)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]