2014-06-03 7 views
0

Я создаю текстовое поле динамически. У меня есть две колонки в моей сетке. Я хочу добавить новое текстовое поле в строку, если другое значение текстового поля = «чай». Я хочу создать новое текстовое поле для соответствующего изменения значения текстового поля строки. Я не могу использовать тег, чтобы получить выбранную строку здесь. потому что я уже использовал тег для какой-то цели. У меня нет большой идеи о теге. Как бы то ни было, как добавить новое текстовое поле в столбец1 в соответствующую строку? Это мой код ..Динамически добавлять текстовое поле в WPF

public int count = 1; 
    public TextBox txt1; 

    private void btn_addnew_Click(object sender, RoutedEventArgs e) 
    { 

     //Creating Rows.. 
     RowDefinition row0 = new RowDefinition(); 
     row0.Height = new GridLength(40); 
     grid1.RowDefinitions.Add(row0); 

     //Creating columns.. 
     ColumnDefinition col0 = new ColumnDefinition(); 
     ColumnDefinition col1 = new ColumnDefinition(); 

     col0.Width = new GridLength(150); 
     col1.Width = new GridLength(250); 

     grid1.ColumnDefinitions.Add(col0); 
     grid1.ColumnDefinitions.Add(col1); 

     int i = count; 

     //1st Column TextBox 

     txt1 = new TextBox(); 
     txt1.Margin = new Thickness(10, 10, 0, 0); 
     Grid.SetRow(txt1, i); 
     Grid.SetColumn(txt1, 0); 

     txt1.Tag = txt1; 

     txt1.MouseEnter+=txt1_MouseEnter; 
     txt1.TextChanged += txt1_TextChanged; 
     grid1.Children.Add(txt1); 
     count++; 
     } 

    private void txt1_MouseEnter(object sender, MouseEventArgs e) 
    { 
     txt1 = ((TextBox)sender).Tag as TextBox; 
     popup.IsOpen = true; 
    } 

    public TextBox txt2; 
    private void txt1_TextChanged(object sender, TextChangedEventArgs e) 
    { 


     if (txt1.Text.ToString() == "Tea") 
     { 

      txt2 = new TextBox(); 

     //How to set row here? 

      Grid.SetRow(txt2, ??); 
      Grid.SetColumn(txt2, 1); 

      txt2.Margin = new Thickness(10, 10, 0, 0); 
      grid1.Children.Add(txt2); 
     } 
     else 
     {    
      grid1.Children.Remove(txt2); 
     } 
    } 
+0

Я хотел бы предложить вам использовать StackPanel в этом случае, или просто добавить defination строки и использовать счетчик для установки строки или, возможно, вы также можете использовать UniformGrid. – pushpraj

+0

Прошу прощения, но я не уверен, чего вы пытаетесь достичь этим. Как вы будете отслеживать данные, которые вы войдете во множество текстовых полей, которые вы добавите? Если вы предоставите datamodel, поддерживающий ваш пользовательский интерфейс, тогда будет n количество способов достижения этого элегантно. – Nitin

+0

Ничего особенного. Я просто хочу добавить текстовое поле в соответствующую строку для значения Textbox = «tea». Я не знаю, как получить индекс Row. – JohnPaul

ответ

1

Если вы просто хотите, чтобы достичь этого, то более элегантный способ будет добавить пользовательский элемент управления для вашего приложения, как показано ниже:

<UserControl x:Class="WpfApplication4.TestUserControl" 
      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="300" d:DesignWidth="300"> 
    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition/> 
      <ColumnDefinition/> 
     </Grid.ColumnDefinitions> 
     <TextBox Name="TextBox1"/> 
     <TextBox Grid.Column="1"> 
      <TextBox.Style> 
       <Style TargetType="TextBox"> 
        <Setter Property="Visibility" Value="Collapsed"/> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding Text, ElementName=TextBox1, UpdateSourceTrigger=PropertyChanged}" Value="tea"> 
          <Setter Property="Visibility" Value="Visible"/> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style> 
      </TextBox.Style> 
     </TextBox> 

    </Grid> 
</UserControl> 

затем в методе btn_addnew_Click(), вам просто нужно добавить UserControl пользователю Grid и присвоить ему строку и столбец. Отображение/Скрытие текстового поля будет осуществляться самим пользователем.

var userControl = new MyUserControl(); 
    userControl .Margin = new Thickness(10, 10, 0, 0); 
    Grid.SetRow(userControl , i); 

    grid1.Children.Add(userControl); 

ИЛИ , если вы хотите иметь значение Grid.Row для TextBox1 вы можете получить его непосредственно, как:

 if (textbox1 != null) 
     { 
      int row = (int)textbox1.GetValue(Grid.RowProperty); 
      Grid.SetRow(txt2, row); 
     } 
+0

Я создаю текстовое поле динамически .. не в XAML – JohnPaul

+0

в wpf, что бы мы ни пытались сделать в коде позади, может быть достигнуто в xaml более эффективно, могу ли я знать, есть ли какая-то конкретная причина, по которой вы не хотите использовать xaml? – Nitin

+0

Я новичок в WPF.и я запрограммировал так. его очень сложно вернуться и перепрограммировать. Пожалуйста, помогите мне определить выбранную строку для моего вышеупомянутого вопроса. В будущем я попробую ответить – JohnPaul

0

Прикрепленные свойства могут быть использованы для хранения такой информации, чтобы определить вложенное свойство в классе

public static int GetGridRow(DependencyObject obj) 
    { 
     return (int)obj.GetValue(GridRowProperty); 
    } 

    public static void SetGridRow(DependencyObject obj, int value) 
    { 
     obj.SetValue(GridRowProperty, value); 
    } 

    // Using a DependencyProperty as the backing store for GridRow. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty GridRowProperty = 
     DependencyProperty.RegisterAttached("GridRow", typeof(int), typeof(ViewModel), new PropertyMetadata(0)); 

затем использовать его для хранения значения строки

private void btn_addnew_Click(object sender, RoutedEventArgs e) 
{ 
    //1st Column TextBox 

    txt1 = new TextBox(); 
    Grid.SetRow(txt1, i); 
    SetGridRow(text1, i); 
    ... 
    grid1.Children.Add(txt1); 
    count++; 
} 

затем использовать его, когда и нужно

//How to set row here? 

Grid.SetRow(txt2, GetGridRow(txt1)); 
Grid.SetColumn(txt2, 1); 
+0

Я получаю ошибку, typeof (ViewModel). он просит меня добавить сборку – JohnPaul

+0

Так как я не знаю вашего класса, поэтому я ставил ViewModel в качестве ссылки. вы можете заменить его классом модели или кодом класса за именем класса (MainWindow) и т. д. или создать новый класс, наследующий DependencyObject, если это необходимо. – pushpraj

+0

Я не хочу наследовать. я просто хочу значение индекса Row. не могли бы вы сделать код немного понятным? Я просто хочу установить значение строки для выбранной строки – JohnPaul

Смежные вопросы