hamid18 Ответов: 2

Как извлечь отдельные значения оси x оси y из точки для рисования линии в WPF


В классе ViewModel у меня есть ObservableCollection<List<point>> MyList в качестве свойства. в xaml мне нужно извлечь значения оси x по оси y, чтобы нарисовать линии из Mylist. Я уже установил DataContext для экземпляра виртуальной машины в xaml.

Что я уже пробовал:

<ScrollViewer Name="scrollViewer" HorizontalScrollBarVisibility="Auto"   Grid.Row="2" Grid.Column="3" 
                    Height= "600" Width="Auto">
            <ItemsControl ItemsSource="{Binding Path=MyList}">
                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <Canvas x:Name="front_canvas" Background="White"  Height="1200" Width="{Binding CanvasWidth}" />
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <Line X1="{Binding Path=LinePoints}" Y1="{Binding LinePoints}" 
                            X2="{Binding LinePoints}" Y2="{Binding LinePoints}"
                              Stroke="Black" StrokeThickness="1">
                        </Line>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
        </ScrollViewer>

2 Ответов

Рейтинг:
0

josda1000

Я нашел потенциальную помощь для вас на stackoverflow:
привязка данных - привязка коллекции строк к холсту в WPF - переполнение стека[^]

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


Рейтинг:
0

Kenneth Haugland

Оптимальное решение зависит от вашей проблемы, но я сделал все немного по-другому, так как почти всегда хочется, чтобы ось Y была перевернута при построении графика.
Простое управление линейной диаграммой WPF[^]

<ItemsControl x:FieldModifier="private" x:Name="PlotArea" Canvas.Bottom="40" Canvas.Left="40"  ClipToBounds="True"  ItemsSource="{Binding}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <Canvas >
                <Canvas.LayoutTransform>
                    <ScaleTransform ScaleX="1" ScaleY="-1"></ScaleTransform>
                </Canvas.LayoutTransform>
            </Canvas>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
</ItemsControl>


Моя проблема заключалась в том, что наблюдаемая коллекция не могла быть связана непосредственно с точками полилинии. Поэтому я закончил тем, что написал некоторый код, который делал это вручную. Или вы можете сделать подход, который уже предложен.