2013-07-12 1 views
1

У меня есть Canvas в моем приложении WPF. Я добавляю Rectangle при нажатии кнопки. Width Исправлено, но Height - значение, введенное пользователем в TextBox/GridCell.Как добавить прямоугольник один за другим вертикально на холст в WPF с помощью C#?

Когда я добавляю прямоугольник на Canvas с указанием Height. он добавляет прямоугольник, но он не появляется один за другим. Есть идеи?

В .xaml.cs:

int width=200; 
Reactangle rect; 
static int val=0; 
    Protected void Add() 
    { 
      rect = new Rectangle(); 
      rect.Stroke = Brushes.Red; 
      rect.StrokeThickness = 1; 
      rect.Height = Convert.ToInt32(txtheight.Text); 
      rect.Width = width; 
      Canvas.SetLeft(rect,100); 
      Canvas.SetTop(rect,rect.Height); 
      rect.Tag = val; 
      canvasboard.Children.Add(rect); 
      val=val+1; 
    } 

enter image description here Это добавляет прямоугольник, но не точно один за другим на холсте.

<Canvas Name="canvasboard" Background="White" Margin="2"> 
     </Canvas> 
<TextBox Name="txtheight" Width="150"/> 

Примечание: Я не могу использовать WrapPanel или StackPanel для этой формы. и хотите внести изменения в существующий код.

Помогите оценить!

+0

Вы можете делиться минимально необходимыми битами в вашем .xaml-файле, поэтому нам не нужно воссоздавать сценарий из вашего описания? – RQDQ

+0

привет @ RQDQ, пожалуйста, проверьте, что я изменил свой код! просто добавьте кнопку ..! –

+0

Это опечатка: «rect.Height = txtheight.Text»? потому что rect.Height требует двойной, а не строку. –

ответ

2

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

private void Add() { 
    rect = new Rectangle { 
    Stroke = Brushes.Red, 
    StrokeThickness = 1, 
    Height = Convert.ToDouble(txtheight.Text), 
    Width = width 
    }; 
    Canvas.SetLeft(rect, 100); 
    double canvasTop = 0.0; 
    if (canvasboard.Children.Count > 0) { 
    var lastChildIndex = canvasboard.Children.Count - 1; 
    var lastChild = canvasboard.Children[lastChildIndex] as FrameworkElement; 
    if (lastChild != null) 
     canvasTop = Canvas.GetTop(lastChild) + lastChild.Height + 1; 
    } 
    Canvas.SetTop(rect, canvasTop); 
    rect.Tag = val++; 
    canvasboard.Children.Add(rect); 
} 
+0

эй @Viv это сработало спасибо много ..! :) –

2

Попробуйте хранить локальную переменную, которая поддерживает объединенную высоту всех прямоугольниками:

private double _top = 0; 

    protected void Add() 
    { 
     var rect = new Rectangle(); 
     rect.Stroke = Brushes.Red; 
     rect.StrokeThickness = 1; 
     rect.Height = double.Parse(txtheight.Text); 
     rect.Width = 20; 
     Canvas.SetLeft(rect, 100); 
     Canvas.SetTop(rect, _top); 
     _top += rect.Height; 
     rect.Tag = val; 
     canvasboard.Children.Add(rect); 
     val = val + 1; 
    } 
+0

hey @Richard E это тоже работает, но я использовал решение Viv ... Спасибо! –