Расположение UserControl в WPF



Я новичок в WPF, я создал новый UserControl MyUserControl.



Теперь я удивлен: У UserContol нет местоположения.



Как я могу прочитать (по коду) myUserControl1.Location в Родительском контейнере?



Поясняю:



У меня есть несколько точек (UserControls), которые пользователь может перетащить в панель. На самом деле, я не уверен, что это будет за панель... Возможно, Сетка.



Теперь эти точки должны быть связаны линией.

На самом деле, у меня есть Dot.Head и Dot.Queue свойства (также точки). Итак, когда добавляется голова или очередь, мне нужно динамически создать связь (линию) между ними [A]-----[B]. Это для этой строки Я ищу начальную и конечную точки, чтобы установить.



Управление XAML:



<UserControl x:Class="LinePlan.Stop"
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="21" d:DesignWidth="80">
<Canvas>
<Path Fill="LightBlue" Width="16" Height="16">
<Path.Data>
<EllipseGeometry x:Name="Dot" Center="8,8"
RadiusX="4" RadiusY="4"/>
</Path.Data>
</Path>
<TextBlock x:Name="StopText" Text="Eiffel Tower" Canvas.Left="16"/>
</Canvas>
</UserControl>


Код:



public partial class Stop : UserControl
{
private Stop head;
private Stop tail;
private LineGeometry headLine;
private LineGeometry queueLine;

public Stop()
{
InitializeComponent();
}

public Stop Head
{
get { return head; }
set
{
if (head != value)
{
head = value;
if (head == null)
{
if (headLine != null)
headLine = null;
}
else
{
headLine = new LineGeometry();
headLine.StartPoint = head.DotPosition;
headLine.EndPoint = this.DotPosition;

// ?? Add this line to the parent
}

}
}
}

public Stop Tail
{
get { return tail; }
set { tail = value; }
}

public Point DotPosition
{
get
{
double x = Canvas.GetLeft(this) + this.Dot.Center.X;
double y = Canvas.GetTop(this) + this.Dot.Center.Y;
return new Point(x, y);
}
set
{
Canvas.SetLeft(this, value.X - this.Dot.Center.X);
Canvas.SetTop(this, value.Y - this.Dot.Center.Y);
}
}
}
764   2  

2 ответов:

Система компоновки WPF не использует абсолютное позиционирование, Если только вы не размещаете элементы управления в контейнере, поддерживающем абсолютное позиционирование (обычно это Canvas). Если вы используете Canvas, Вы можете получить или установить положение элемента управления с помощью Canvas.Left, Canvas.Right, Canvas.Top и Canvas.Bottom присоединенные свойства:

double x = Canvas.GetLeft(myControl);
double y = Canvas.GetTop(myControl);
Теперь, если вам нужно фактическое расположение элемента управления (относительно его родителя), вы можете использовать метод VisualTreeHelper.GetOffset:
Vector offset = VisualTreeHelper.GetOffset(myControl);
double x = offset.X;
double y = offset.Y;

Элементы (например, пользовательские элементы управления) обычно размещаются на панелях в WPF. В зависимости от того, какую панель вы используете, панель может добавить некоторые присоединенные свойства к пользовательскому элементу управления. Если пользовательский элемент управления помещен в Canvas, он получит вложенные свойства Left, Top, Right и Bottom. Однако, если пользовательский элемент управления помещен в Grid , он получит присоединенные свойства Row и Column (и некоторые другие). Другие панели, такие как StackPanel, не будут присоединять никаких свойств. Не существует такого понятия, как расположение универсального пользовательского элемента управления.

Обзор Панелей

Обзор Вложенных Свойств

Предполагая, что вы используете Canvas в качестве панели, вы можете получить доступ к вложенным свойствам Left и Top следующим образом:

Double x = Canvas.GetLeft(myUserControl1);
Double y = Canvas.GetTop(myUserControl1);

Comments

    Ничего не найдено.