动态生成文本框以匹配总和

时间:2012-04-07 20:44:15

标签: wpf wpf-controls

我正在尝试生成动态文本框 从两个文本框开始。

  
    

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

  

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

任何帮助?

由于


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

<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中?

由于

2 个答案:

答案 0 :(得分:1)

查看您提供的其他信息,并考虑到您想要创建的对象的复杂性,UserControl可能是最合适的。此代码是使用DoubleClick显示如何将UserControl添加到ScrollViewer的示例。您需要在UserControl中公开属性才能从TextBox中获取信息,否则代码应与我之前的答案相似。

即:

UserControl 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>

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="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);
    }

}

这是一个基本想法,我使用StackPanel来保留TextBox's您可能希望使用DockPanel来保存标签等,并将其添加到{{} 1}}。

<强>的Xaml

StackPanel

<强>代码

<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>

答案 1 :(得分: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 ...