WPF / C #: получить конечную точку динамического пути и добавить к ней объект - PullRequest
0 голосов
/ 13 июля 2010

Я ищу способ получить конечную точку динамического пути и добавить к нему объект - аналогично шаблону такого типа:

альтернативный текст http://i29.tinypic.com/159182.png

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

<Path x:Name="path" Data="M621,508 L582.99987,518.00011 569.99976,550.00046 511.9996,533.00032 470.9995,509 485.99953,491.99981" Margin="469,0,0,168" Stretch="Fill" Stroke="Black" StrokeThickness="4" Height="62" VerticalAlignment="Bottom" HorizontalAlignment="Left" Width="154" Visibility="Hidden"/>

Я использовал это:

<Path Stroke="Black" x:Name="path1" Data="{Binding MyProperty1}"  Margin="0" StrokeThickness="4"/>

где я получаю данные о пути из базы данных.

Есть предложения / комментарии?

PS. Я пытаюсь поместить объект / изображение (движущееся или неподвижное) в конечную точку пути.

1 Ответ

0 голосов
/ 13 июля 2010

Хм, повторяя мои комментарии выше, вероятно, у вас есть что-то вроде этого

public class PathViewModel 
{
    public ObservableCollection<Point> Points { get; private set; }
    PathViewModel ()
    {
        Points = new ObservableCollection<Point> ();
    }
}

просто расширяйте эту модель, реализуя INotifyPropertyChanged и создавая явное свойство для последней точки в пути,

public class PathViewModel : INotifyPropertyChanged
{
    private static readonly PropertyChangedEventArgs OmegaPropertyChanged = 
        new PropertyChangedEventArgs ("Omega");

    // returns true if there is at least one point in list, false
    // otherwise. useful for disambiguating against an empty list
    // (for which Omega returns 0,0) and real path coordinate
    public bool IsOmegaDefined { get { return Points.Count > 0; } }

    // gets last point in path, or 0,0 if no points defined
    public Point Omega 
    { 
        get 
        { 
            Point omega;
            if (IsOmegaDefined)
            {
                omega = Points[Points.Count - 1];
            }
            return omega;
        } 
    }

    // gets points in path
    public ObservableCollection<Point> Points { get; private set; }

    PathViewModel ()
    {
        Points = new ObservableCollection<Point> ();
    }

    // interfaces

    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

    #endregion

    // private methods

    private void Points_CollectionChanged (
        object sender,
        NotifyCollectionChangedEventArgs e)
    {
        // if collection changed, chances are so did Omega!
        if (PropertyChanged != null)
        {
            PropertyChanged (this, OmegaPropertyChanged);
        }
    }

}

единственное, на что стоит обратить внимание, - это запуск события изменения свойства при изменении коллекции. это уведомляет WPF, что модель изменилась.

Теперь, на земле Xaml,

<!-- assumes control's DataContext is set to instance of PathViewModel -->
<Path 
    Stroke="Black" 
    x:Name="path1" 
    Data="{Binding Path=Points}"  
    Margin="0" 
    StrokeThickness="4"/>
<!-- or whatever control you like, button to demonstrate binding -->
<Button 
    Content="{Binding Path=Omega}" 
    IsEnabled="{Binding Path=IsOmegaDefined}"/>

Хорошо, поэтому IsEnabled выше не будет скрывать изображение \ кнопку, но привязка к Visibility - это простой вопрос либо а) изменения нашей модели представления для предоставления свойства видимости, либо б) связывания со значением конвертер, который преобразует наше логическое значение в перечисление видимости.

Надеюсь, это поможет! :)

...