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

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

2 голосов
/ 20 сентября 2010

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

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

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

Iобъясните:

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

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

На самом деле, у меня есть свойства 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 ]

3 голосов
/ 20 сентября 2010

Система макетов 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;
1 голос
/ 20 сентября 2010

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

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

Обзор прилагаемых свойств

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

Double x = Canvas.GetLeft(myUserControl1);
Double y = Canvas.GetTop(myUserControl1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...