0

我正在尝试生成以两个文本框开头的动态文本框。

如果该值小于第一个文本框中的值,则动态生成另一个文本框并让用户输入更多值。
必须这样做,直到从第二个到最后一个生成的所有文本框的值的总和等于第一个文本框的值。

当然,需要使用文本框以及标签等生成其他内容并正确定位,因此我想到了使用网格并动态生成网格,但在此之上我迷路了。

有什么帮助吗?

谢谢


我使用带有以下代码的滚动查看器

<ScrollViewer Margin="8,8,8,14.417" Grid.Row="4" Grid.ColumnSpan="5" VerticalScrollBarVisibility="Hidden">
    <Grid Margin="8" Grid.Row="4" Grid.ColumnSpan="4" x:Name="amtGrid">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" MinWidth="103"/>
            <ColumnDefinition Width="Auto" MinWidth="324"/>
            <ColumnDefinition Width="Auto" MinWidth="218"/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <ComboBox x:Name="crdrnextrows" Margin="32.367,8,8,7.423" SelectedIndex="1" />
        <ComboBox Background="#FFC6C3C6" Margin="8" x:Name="comboboxCr" GotKeyboardFocus="comboboxCr_GotKeyboardFocus" Grid.Column="1"/>
        <TextBox Background="#FFC6C3C6" Foreground="White" IsEnabled="True" Margin="7.973,8,8,8" x:Name="txtBoxam1" Grid.Column="2" LostFocus="txtBoxam1_LostFocus"/>
        <TextBox Background="#FFC6C3C6" Foreground="White" IsEnabled="True" Margin="8,8,33.972,8" x:Name="txtBoxamt2" Grid.Column="3" LostFocus="textBox4_LostFocus"/>
    </Grid>
</ScrollViewer>

上面还有另一个文本框,有类似的代码,但没有滚动查看器,现在我想的是动态创建滚动查看器中显示的网格的实例,只要需要使它们相等。

是否可以创建同一网格的新实例并使用代码动态地将它们添加到 scollviewer 中?

谢谢

4

2 回答 2

1

查看您提供的附加信息并考虑到您要创建的对象的复杂性,UserControl可能是最合适的。此代码是一个示例,使用DoubleClick来展示如何将 UserControl 添加到 ScrollViewer。您需要公开属性UserControl才能从您的 TextBoxes 中获取信息,否则代码应该与我之前的回答类似。

IE:

用户控件 Xaml

<UserControl x:Class="WpfApplication1.UserControl1"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="70" d:DesignWidth="985">
    <Grid Margin="8" Grid.Row="4" Grid.ColumnSpan="4" x:Name="amtGrid" Height="40">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" MinWidth="103"/>
            <ColumnDefinition Width="Auto" MinWidth="324"/>
            <ColumnDefinition Width="Auto" MinWidth="218"/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <ComboBox x:Name="crdrnextrows" Margin="32.367,8,8,7.423" SelectedIndex="1" />
        <ComboBox Background="#FFC6C3C6" Margin="8" x:Name="comboboxCr" GotKeyboardFocus="comboboxCr_GotKeyboardFocus" Grid.Column="1"/>
        <TextBox Background="#FFC6C3C6" Foreground="White" IsEnabled="True" Margin="7.973,8,8,8" x:Name="txtBoxam1" Grid.Column="2" LostFocus="txtBoxam1_LostFocus"/>
        <TextBox Background="#FFC6C3C6" Foreground="White" IsEnabled="True" Margin="8,8,33.972,8" x:Name="txtBoxamt2" Grid.Column="3" LostFocus="txtBoxamt2_LostFocus"/>
    </Grid>
</UserControl>

窗口 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="123" Width="1098" xmlns:my="clr-namespace:WpfApplication1" MouseDoubleClick="Window_MouseDoubleClick">

    <ScrollViewer VerticalScrollBarVisibility="Auto">
        <StackPanel Name="stackPanel1" VerticalAlignment="top" HorizontalAlignment="Left" >
            <my:UserControl1 x:Name="userControl11" Width="1077" />
        </StackPanel>
    </ScrollViewer>

</Window>

主窗口代码

public partial class MainWindow : Window
{

    public MainWindow()
    {
        InitializeComponent();
    }

    private void Window_MouseDoubleClick(object sender, MouseButtonEventArgs e)
    {
        UserControl1 newUserControl = new UserControl1();
        newUserControl.Width = userControl11.Width;
        newUserControl.Height = userControl11.Height;
        stackPanel1.Children.Add(newUserControl);
    }

}

这是一个基本的想法,我正在使用 aStackPanel来保存TextBox's您可能想要使用 aDockPanel来保存您的标签等并将其添加到StackPanel.

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">
    <Grid>
        <StackPanel Name="myContainer">
            <TextBox Height="23" HorizontalAlignment="Left" Margin="10,10,0,0" Name="textBox1" VerticalAlignment="Top" Width="120" KeyDown="textBox1_KeyDown" />
            <TextBox Height="23" HorizontalAlignment="Left" Margin="10,10,0,0" Name="textBox2" VerticalAlignment="Top" Width="120" KeyDown="textBox2_KeyDown"/>
        </StackPanel>
    </Grid>
</Window>

代码

public partial class MainWindow : Window
{
    Collection<Control> myControls = new Collection<Control>();

    public MainWindow()
    {
        InitializeComponent();
        myControls.Add(textBox2);
    }


    private void textBox2_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Enter)
        {
            int temp;
            int sum;
            sum = 0;
            foreach (TextBox tb in myControls)
            {
                if (int.TryParse(tb.Text, out temp))
                {
                    sum += temp;
                }
            }
            int test = 0;
            if (int.TryParse(textBox1.Text, out test))
            {
                if (sum < test)
                {
                    TextBox newtb = new TextBox();
                    newtb.Width = ((TextBox)sender).Width;
                    newtb.Height = ((TextBox)sender).Height;
                    newtb.Margin = new Thickness(((TextBox)sender).Margin.Left, ((TextBox)sender).Margin.Top , ((TextBox)sender).Margin.Right , ((TextBox)sender).Margin.Bottom);
                    newtb.HorizontalAlignment = ((TextBox)sender).HorizontalAlignment;
                    newtb.KeyDown += new KeyEventHandler(textBox2_KeyDown);
                    myContainer.Children.Add(newtb);
                    myControls.Add(newtb);
                    newtb.Focus();
                }
                else
                    this.Background = Brushes.LightBlue;
            }
        }
    }

    private void textBox1_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Enter)
        {
            textBox2.Focus();
        }
    }
}
于 2012-04-08T01:57:04.207 回答
0

将集合传递给项目。然后根据需要在集合中添加到集合中。

 public class dynamicInts
 {
     private int dInt;
     private ObservableCollection<DynamicInt> dynamicInts

     public int DInt 
     {
         get { return dInt; }
         set 
         {
             value = dInt;
             int sumInt;
             foreach (DynamicInt di in dynamicInts) sumInt += di.Dint)
             if (sumInt < 2*dynamicInts) dynamicInts.add(newdynamicInts ...
于 2012-04-08T23:05:19.057 回答