WPF: отображение полилинии и точек одновременно - PullRequest
1 голос
/ 10 мая 2011

У меня есть список отрезков, и каждый отрезок содержит список точек.Находясь на одном и том же холсте, я хочу отобразить каждый отрезок линии и одновременно отметить каждую точку (например, с эллипсом).Я могу использовать ItemsControl для отображения сегментов, но я застрял в том, как отображать точки.Я начал реализовывать пользовательский элемент управления, полученный из Shape, но должен быть более простой способ.Заранее спасибо за помощь.

public class VesselAnatomy : IEnumerable, INotifyCollectionChanged
{
...
List<BaseVessel> _Segments;
...
}

public class BaseVessel : INotifyPropertyChanged
{
...
ObservableCollection<Point> _VesselPoints;
public ObservableCollection<Point> VesselPoints
        {
            get
            {
                return _VesselPoints;
            }
        }
...
}

public MainWindow()
{
...
VesselAnatomy Vessels = new VesselAnatomy();
...
MasterContainer.DataContext =  Vessels;
...
}

<ItemsControl x:Name="VesselDisplay"
                          Height="750"
                          Width="750"
                      ItemsSource="{Binding}">
                        <Polyline Points="{Binding VesselPoints, Converter={StaticResource ObsListPointConverter}}"
                            Stroke="Red"
                            StrokeThickness="7">
                            <Polyline.ToolTip>
                                <ToolTip>
                                    <TextBlock Text="{Binding Name}"/>
                                </ToolTip>
                            </Polyline.ToolTip>
                        </Polyline>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>

1 Ответ

0 голосов
/ 10 мая 2011

Вы можете использовать ItemsControl для точек, просто измените ItemsPanel и свяжите позиции элементов.

<Window ... >
    <Window.Resources>
        <PointCollection x:Key="points">
            <Point X="20" Y="20" />
            <Point X="40" Y="35" />
            <Point X="60" Y="40" />
            <Point X="80" Y="60" />
            <Point X="100" Y="40" />
            <Point X="120" Y="30" />
            <Point X="140" Y="40" />
            <Point X="160" Y="20" />
        </PointCollection>
        <DataTemplate DataType="{x:Type Point}">
            <Ellipse Width="9" Height="9" Fill="White" Stroke="DodgerBlue" StrokeThickness="1" x:Name="e">
                <Ellipse.RenderTransform>
                    <TransformGroup>
                        <TranslateTransform X="-4" Y="-4" />
                        <TranslateTransform X="{Binding X}" Y="{Binding Y}" />
                    </TransformGroup>
                </Ellipse.RenderTransform>
            </Ellipse>
        </DataTemplate>
    </Window.Resources>
    <Grid>
        <Polyline x:Name="line" Stroke="LightBlue" StrokeThickness="2" Points="{StaticResource points}" /> 
        <ItemsControl x:Name="ptsdisplay" ItemsSource="{StaticResource points}">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <Canvas />
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
        </ItemsControl>
    </Grid>
</Window>

Если у вас много очков и этот метод слишком медленный, попробуйте http://msdn.microsoft.com/en-us/magazine/dd483292.aspx

...