Несколько полилиний в окне просмотра с использованием WPF

Я хотел бы «нарисовать» несколько Polyline и несколько Textblock или Label в Viewbox в WPF.

Поскольку Viewbox допускает только одного ребенка, я попытался поместить Polyline внутри элемента Canvas, но это не сработало:

XAML:

<Viewbox Stretch="Uniform">
     <Canvas Margin="10">
        <Polyline 
                        Points="{Binding Path=Points2}"
                        Stroke="Green"
                        StrokeThickness="2" >
        </Polyline>
                    <!-- other Polylines, Textblocks etc.  would go here... -->
    </Canvas>
</Viewbox>

Polyline отображается правильно, когда я использую этот код (т.е. я просто отбросил Canvas):

<Viewbox Stretch="Uniform">
        <Polyline 
                        Points="{Binding Path=Points2}"
                        Stroke="Green"
                        StrokeThickness="2" >
        </Polyline>
</Viewbox>

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

Решение:

<Viewbox Stretch="Uniform">
     <Grid>
        <Polyline 
                        Points="{Binding Path=Points2}"
                        Stroke="Green"
                        StrokeThickness="4" >
        </Polyline>
        <Polyline 
                        Points="{Binding Path=Points2}"
                        Stroke="Yellow"
                        StrokeThickness="2" >
        </Polyline>
    </Grid>
</Viewbox>

Это помещает одинаковые полигоны друг на друга, то есть тонкую желтую полилинию поверх широкой зеленой полилинии.

Мне помог ответ на этот вопрос stackoverflow.


person Onur    schedule 08.07.2013    source источник


Ответы (2)


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

<Viewbox Stretch="Uniform">
    <Grid  Margin="10">
        <Polyline 
                    Points="{Binding Path=Points2}"
                    Stroke="Green"
                    StrokeThickness="2" >
        </Polyline>
    </Grid>
</Viewbox>
person Andy    schedule 08.07.2013
comment
Как я могу поставить их друг на друга, то есть если я поставлю два одинаковых полигона: как они могут разместиться на одинаковых позициях? - person Onur; 09.07.2013
comment
Как я могу использовать поля позиционирования, которые должны содержать отрицательные значения (не разрешено для полей)? - person Onur; 09.07.2013
comment
Они должны быть в состоянии сидеть друг над другом просто отлично, если вы дадите им одинаковую маржу, и отрицательная маржа тоже в порядке. ‹Отступ полилинии=-100,0,0,0 - person Andy; 09.07.2013
comment
Отрицательные поля не работали для меня. В документах также говорится, что они не должны быть отрицательными: msdn. microsoft.com/en-us/library/ - person Onur; 10.07.2013

Причина, по которой вы не можете видеть свои полилинии, заключается в том, что Canvas имеет значения по умолчанию Height и Width, равные 0.

Попробуйте установить Height и Width явно.

<Viewbox x:Name="ViewBox" Stretch="Uniform">
    <Canvas x:Name="chartCanvas" Margin="10" Height="200" Width="300">
        <Polyline 
                Points="{Binding Path=Points2}"
                Stroke="Green"
                StrokeThickness="2">
        </Polyline>
        <!-- other Polylines, Textblocks etc.  would go here... -->
    </Canvas>
</Viewbox>
person Richard E    schedule 08.07.2013
comment
В порядке. Но что мне делать, если я хочу автоматически определить размер холста? Полигоны будут меняться в размере, и я не знаю заранее ширину/высоту. - person Onur; 09.07.2013
comment
Вы можете привязать свойства Canvas Height и Width к свойству ViewModel/Model, которое вычисляет максимальный размер при создании полигонов. - person Richard E; 09.07.2013