Расположение 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);
}
}
}
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