在C#中向UI动态添加元素

原子强力

问题

我有一个C#窗口,上面有一些文本字段和按钮。它的开始与此类似:初始界面

当用户单击该“ +添加机器功能”按钮时,我需要创建新的控件行并将该按钮移到这些控件下方: 新增机器功能

如果用户单击“ +添加比例单位”,则程序需要在右侧添加一些控件: 新增比例单位

尝试解决方案

我曾尝试使用Windows Forms的TableLayoutPanel,但它似乎能够以各种奇怪的方式调整自身大小以适应其他控件,例如,它会使一排控件比其他控件宽得多,并使某些行变得如此之短,以至于切断了我的控制。

我还尝试过通过简单地计算控件的相对位置,将控件自身放置到表单中。但是,我认为这是不好的编程习惯,因为这会使表单的布局在以后很难更改。如果用户通过按旁边的“ X”删除行或刻度单位,则此方法还要求程序查找该行以下的每个元素并将其单独上移,这是非常低效的。

我的问题是:如何通过Windows Forms布局或WPF或其他方式创建一个动态增长/缩小的应用程序?

乌斯曼·扎法(Usman Zafar)

在WPF中,您可以执行以下操作:

班级

public class MachineFunction
{
    public string Name { get; set; }
    public int Machines { get; set; }

    public ObservableCollection<ScaleUnit> ScaleUnits { get; set; }

    public MachineFunction()
    {
        ScaleUnits = new ObservableCollection<ScaleUnit>();
    }
}

public class ScaleUnit
{
    public string Name { get; set; }
    public int Index { get; set; }

    public ScaleUnit(int index)
    {
        this.Index = index;
    }
}

Window.xaml

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
<StackPanel>
    <ItemsControl Name="lstMachineFunctions">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition/>
                            <ColumnDefinition/>
                            <ColumnDefinition/>
                        </Grid.ColumnDefinitions>
                        <Grid.RowDefinitions>
                            <RowDefinition/>
                            <RowDefinition/>
                            <RowDefinition/>
                        </Grid.RowDefinitions>
                        <TextBlock Grid.Row="0" Grid.Column="1" Text="Machine Function"/>
                        <TextBlock Grid.Row="0" Grid.Column="2" Text="Number of Machines"/>
                        <Button Grid.Row="1" Grid.Column="0" Click="OnDeleteMachineFunction">X</Button>
                        <TextBox Grid.Row="1" Grid.Column="1" Text="{Binding Name}"/>
                        <TextBox Grid.Row="1" Grid.Column="2" Text="{Binding Machines}"/>
                    </Grid>

                    <ItemsControl ItemsSource="{Binding ScaleUnits}">
                        <ItemsControl.ItemTemplate>
                            <DataTemplate>
                                <Grid Margin="12,0,0,0">
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition/>
                                        <ColumnDefinition/>
                                    </Grid.ColumnDefinitions>
                                    <Grid.RowDefinitions>
                                        <RowDefinition/>
                                        <RowDefinition/>
                                        <RowDefinition/>
                                    </Grid.RowDefinitions>
                                    <TextBlock Grid.Row="0" Grid.Column="1" Text="Machine/Scale Unit"/>
                                    <Button Grid.Row="1" Grid.Column="0" Click="OnDeleteScaleUnit">X</Button>
                                    <TextBox Grid.Row="1" Grid.Column="1" Text="{Binding Name}"/>
                                    <TextBlock Grid.Row="2" Grid.Column="1" Text="{Binding Index, StringFormat='Scale Unit {0}'}"/>
                                </Grid>
                            </DataTemplate>
                        </ItemsControl.ItemTemplate>
                        <ItemsControl.ItemsPanel>
                            <ItemsPanelTemplate>
                                <StackPanel Orientation="Horizontal"/>
                            </ItemsPanelTemplate>
                        </ItemsControl.ItemsPanel>
                    </ItemsControl>
                    <Button VerticalAlignment="Center" Click="OnAddScaleUnit">Add Scale Unit</Button>
                </StackPanel>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>

    <Button HorizontalAlignment="Left" Click="OnAddMachineFunction">Add Machine Function</Button>
</StackPanel>
</Window>

Window.cs

public partial class MainWindow : Window
{
    public ObservableCollection<MachineFunction> MachineFunctions { get; set; }

    public MainWindow()
    {
        InitializeComponent();

        lstMachineFunctions.ItemsSource = MachineFunctions = new ObservableCollection<MachineFunction>();
    }

    private void OnDeleteMachineFunction(object sender, RoutedEventArgs e)
    {
        MachineFunctions.Remove((sender as FrameworkElement).DataContext as MachineFunction);
    }

    private void OnAddMachineFunction(object sender, RoutedEventArgs e)
    {
        MachineFunctions.Add(new MachineFunction());   
    }

    private void OnAddScaleUnit(object sender, RoutedEventArgs e)
    {
        var mf = (sender as FrameworkElement).DataContext as MachineFunction;

        mf.ScaleUnits.Add(new ScaleUnit(mf.ScaleUnits.Count));
    }

    private void OnDeleteScaleUnit(object sender, RoutedEventArgs e)
    {
        var delScaleUnit = (sender as FrameworkElement).DataContext as ScaleUnit;

        var mf = MachineFunctions.FirstOrDefault(_ => _.ScaleUnits.Contains(delScaleUnit));

        if( mf != null )
        {
            mf.ScaleUnits.Remove(delScaleUnit);

            foreach (var scaleUnit in mf.ScaleUnits)
            {
                scaleUnit.Index = mf.ScaleUnits.IndexOf(scaleUnit);
            }
        }
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Groovy中向ArrayList动态添加元素

来自分类Dev

在SwiftUI中向VStack动态添加元素

来自分类Dev

根据动态模板向集合中添加元素

来自分类Dev

向 Angularjs 动态添加元素

来自分类Dev

如何从MATLAB向C#列表添加元素?

来自分类Dev

如何从MATLAB向C#列表添加元素?

来自分类Dev

C# 向现有 XML 添加元素

来自分类Dev

向多维矢量C ++中添加元素

来自分类Dev

如何在C ++中向数组添加元素?

来自分类Dev

如何向集合中添加元素

来自分类Dev

C ++:向元组添加元素

来自分类Dev

动态地向对象添加元素

来自分类Dev

如何动态地向Source添加元素?

来自分类Dev

MVVM动态向滚动视图添加元素

来自分类Dev

在Polymer元素中向SVG添加元素

来自分类Dev

向数组添加元素

来自分类Dev

向div添加元素

来自分类Dev

动态添加元素上的jQuery UI droppable吗?

来自分类Dev

动态添加元素上的jQuery UI droppable吗?

来自分类Dev

在R中的for循环中向列表中添加元素

来自分类Dev

在R中的for循环中向列表中添加元素

来自分类Dev

终止在Java方法中向List中添加元素

来自分类Dev

JAXB动态添加元素

来自分类Dev

链表未在C中添加元素

来自分类Dev

如何在PHP中向多维数组添加元素?

来自分类Dev

在Perl6中向SetHash添加元素的方法

来自分类Dev

向Entity对象java中添加元素

来自分类Dev

在F#中向集合添加元素的繁琐语法

来自分类Dev

在 Drupal 8 中向字段小部件添加元素