Как то ничего сложнее прямоугольников и эллипсов на WPF не рисовал, а тут на форуме MSDN задали вопрос как нарисовать дугу, да еще и менять ее в процессе работы программы. Ответ по ссылке, и так как я искать на форумах MSDN не умею, то чтобы он не потерялся, подкатом.
Функционал должен быть вот такой:
Т.е. пользователь таскает бегунок, а в заисимости от положения бегунка, у нас растет дуга. Если честно, то сначала думал рисовать эллипс и у него часть закрывать прямоугольниками с цветом фона... Но потом нашел замечательный класс ArcSegment. Вот с его помощью и будем рисовать.
Для формы задал такую разметку:
<Path.Data>
<PathGeometry>
<PathGeometry.Figures>
<PathFigureCollection>
<PathFigure StartPoint="0,50">
<PathFigure.Segments>
<PathSegmentCollection>
<ArcSegment Size="50,50" RotationAngle="45" IsLargeArc="False" Point="0,50" x:Name="arc" />
</PathSegmentCollection>
</PathFigure.Segments>
</PathFigure>
</PathFigureCollection>
</PathGeometry.Figures>
</PathGeometry>
</Path.Data>
</Path>
<Slider Margin="0,200,0,0" VerticalAlignment="Center" Width="100" ValueChanged="Slider_ValueChanged_1"/>
</Grid>
Ну и обработчик изменения положения бегунка (пока писал нижеприведенный код, аж занастольировал. Ведь на первой моей олимпиаде по программированию, была задача по написанию программы с солнышком и землей летающей вокруг него):
double x = 50 * Math.Sin(angle);
double y = 50 * Math.Cos(angle);
arc.Point = new Point(x, y);
arc.IsLargeArc = current.Value > current.Maximum / 2;
}
Все. Как работает, можно посмотреть на картинке в начале статьи или повторив за мной этот пример в Visual Studio.
Функционал должен быть вот такой:
Т.е. пользователь таскает бегунок, а в заисимости от положения бегунка, у нас растет дуга. Если честно, то сначала думал рисовать эллипс и у него часть закрывать прямоугольниками с цветом фона... Но потом нашел замечательный класс ArcSegment. Вот с его помощью и будем рисовать.
Для формы задал такую разметку:
<Grid Background="{StaticResource
ApplicationPageBackgroundThemeBrush}">
<Path Stroke="Red" StrokeThickness="2" HorizontalAlignment="Center" VerticalAlignment="Center"><Path.Data>
<PathGeometry>
<PathGeometry.Figures>
<PathFigureCollection>
<PathFigure StartPoint="0,50">
<PathFigure.Segments>
<PathSegmentCollection>
<ArcSegment Size="50,50" RotationAngle="45" IsLargeArc="False" Point="0,50" x:Name="arc" />
</PathSegmentCollection>
</PathFigure.Segments>
</PathFigure>
</PathFigureCollection>
</PathGeometry.Figures>
</PathGeometry>
</Path.Data>
</Path>
<Slider Margin="0,200,0,0" VerticalAlignment="Center" Width="100" ValueChanged="Slider_ValueChanged_1"/>
</Grid>
Ну и обработчик изменения положения бегунка (пока писал нижеприведенный код, аж занастольировал. Ведь на первой моей олимпиаде по программированию, была задача по написанию программы с солнышком и землей летающей вокруг него):
private
void Slider_ValueChanged_1(object sender, RangeBaseValueChangedEventArgs e)
{
Slider
current = sender as Slider;
double
angle = current.Value / current.Maximum * Math.PI
* 2;double x = 50 * Math.Sin(angle);
double y = 50 * Math.Cos(angle);
arc.Point = new Point(x, y);
arc.IsLargeArc = current.Value > current.Maximum / 2;
}
Все. Как работает, можно посмотреть на картинке в начале статьи или повторив за мной этот пример в Visual Studio.
Комментариев нет:
Отправить комментарий