ko444evnik (ko444evnik) wrote,
ko444evnik
ko444evnik

"...Требутся сок ТРИНАДЦАТИ(!) бобов..."

Из всех-всех-всех компонентов ВижуалСтудии наиболее мною нелюбимый - MSDN.

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

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

Вроде бы простая иерархическая структура - на некоторой глубине превращается клубок слипшехся нитей, катакомбы с грудой повторяющегося материала. Решение простенькой практической задачки может находиться за соседней стенкой, но чтобы обнаружить его, требуется намотать на спидометр десятки коридоров, обработать груды нафиг в данный момент не нужной информации, только для того чтобы понять - где его искать не надо.

Трудность в том, что "для того чтобы задать правильный вопрос, надо знать большую часть ответа". А еще большая трудность - для крутящихся в мозгу концепций не всегда хватает словесных ярлычков, чтобы задать хотя бы неправильный вопрос. Всякий раз после недели пахоты и спустя несколько сотен строк кода, испытываешь смесь облегчения и лютого бешенства, случайно, за очередным поворотом туннеля, обнаружив элементарное решение длиной в пяток строк...

Крайний пример.

Какой в WPF наикратчайший способ нарисовать кружок точно на стыке линий?

Ближайшая к теме статья MSDN - которую показывает Яндекс: Как же нам так взять, и нарисовать не абы что, а эллипс?

И следуя сияющим скрижалям у нас родится вариант номер раз - используем класс System.Windows.Shapes.Ellipse.
Но мы тут же обнаружим, что как раз Ellipse и Rectangle весьма отличаются от всех других фигур по логике отрисовки (а нас, напомню, интересует простое сопряжение с линиями). И там где нам хочется увидеть у кружка центр, будет таки не он, а левый верхний угол прямоугольника в который этот кружок/эллипс вписан. Т.е. методтчно работая бубном требуемый результат получить возможно, но для этого придется дополнительно изощряться.

Поняв, что все, как всегда, не просто, помурыжив, к примеру, Петцольда, у нас родится наиуниверсальнейший вариант номер два: System.Windows.Shapes.Path и в нем EllipseGeometry. Логика размещения соответствует задуманному. Сила и мощь. НО! помещенная внутрь двух (как минимум) дополнительных тегов.

Но если хочется просто нарисовать несчастный кружок, который выглядит как кружок, и не имеет более вообще никаких целей и задач, кроме как выглядеть как кружок? Подобная крамола, не доведет нас до добра. А доведет до варианта номер три: цинично используем класс Polyline, где задаем единственную линию от точки до этой самой точки, и выставляем "способ отрисовки оконечников" в "Round"...

Класс Line можно использовать аналогично, но получается чуть менее экономно - требуется задать 4 свойства вместо одного (вариант номер 4).

Ну и заключительным аккордом явлется отрисовка других мелких примитивов - квадратиков, треугольничков и полукругов - с использованием указанной техники.

Картинка иллюстрирующая процесс:


Исходник:

<Canvas xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

<!-- как бы граф -->
<Polyline
Points="10,10 20,30 60,40 100,30 120,50 140,30"
StrokeThickness="3"
Stroke="Gray" />

<!-- Кружок - вариант №1 : "стыд, позор и кривизна" -->
<Ellipse
Canvas.Left = "20"
Canvas.Top="30"
Width="10"
Height="10"
Fill = "Red" />

<!-- Кружок - вариант №2 : "практическое мамонтоводство" -->  
<Path Fill="Green" >
<Path.Data>
 <EllipseGeometry
  Center="60, 40" 
  RadiusX="5"
  RadiusY="5" />
</Path.Data>
</Path>

<!-- Кружок - вариант №3 : "правой-рукой-левое-ухо-из-под-левого-колена. но короче. и работает..." -->  
<Polyline
Stroke="Blue"
Points="100,30 100,30"
StrokeThickness="10" 
StrokeStartLineCap="Round"
StrokeEndLineCap="Round" />

<!-- Кружок - вариант №4 : "уже менее экономное решение" -->  
<Line
Stroke="Magenta"
X1="120" Y1="50" X2="120" Y2="50"
StrokeThickness="10" 
StrokeStartLineCap="Round"
StrokeEndLineCap="Round" />

<!-- "Вариации на тему" -->  
<Polyline
Stroke="Blue"
Points="140,30 140,30.01"
StrokeThickness="10" 
StrokeStartLineCap="Square"
StrokeEndLineCap="Square" />

<Polyline
Stroke="Blue"
Points="160,30 160,30.01"
StrokeThickness="10" 
StrokeStartLineCap="Triangle"
StrokeEndLineCap="Triangle" />

<Polyline
Stroke="Blue"
Points="180,30 180,30.01"
StrokeThickness="10" 
StrokeStartLineCap="Triangle" />

<Polyline
Stroke="Blue"
Points="200,30 200,30.01"
StrokeThickness="10" 
StrokeEndLineCap="Triangle" />

<Polyline
Stroke="Blue"
Points="220,30 220.01,30"
StrokeThickness="10" 
StrokeEndLineCap="Triangle" />

</Canvas>


* This source code was highlighted with Source Code Highlighter.

Tags: .net, .wpf, нарисовать-кружок
Subscribe

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your IP address will be recorded 

  • 0 comments