2012-03-07 2 views
1

Мне нужно создать пользовательский WPF управления что-то вроде этого enter image description hereтаможенной границы в Ярлык WPF

Как я новичок в WPF, я использовал следующий код (извините за VB.NET)

Public Class TextPlaceholder 
    Inherits System.Windows.Controls.Label 

    Const CustomBorderWidth As Integer = 2 

    Public Sub New() 
    MyBase.New() 
    Me.BorderBrush = SystemColors.ActiveBorderBrush 
    End Sub 

    Protected Overrides Sub OnRender(drawingContext As System.Windows.Media.DrawingContext) 
    MyBase.OnRender(drawingContext) 

    Dim pointTopLeft As New Point(-1, -1) 
    Dim pointTopRight As New Point(Me.ActualWidth, -1) 
    Dim pointBottomLeft As New Point(-1, Me.ActualHeight) 
    Dim pointBottomRight As New Point(Me.ActualWidth, Me.ActualHeight) 

    Dim myPen As New Pen(Me.BorderBrush, CustomBorderWidth) 
    drawingContext.DrawLine(myPen, pointTopLeft, New Point(pointTopLeft.X + 5, pointTopLeft.Y)) 
    drawingContext.DrawLine(myPen, pointTopLeft, New Point(pointTopLeft.X, pointTopLeft.Y + 5)) 

    drawingContext.DrawLine(myPen, pointTopRight, New Point(pointTopRight.X - 5, pointTopRight.Y)) 
    drawingContext.DrawLine(myPen, pointTopRight, New Point(pointTopRight.X, pointTopRight.Y + 5)) 

    drawingContext.DrawLine(myPen, pointBottomLeft, New Point(pointBottomLeft.X + 5, pointBottomLeft.Y)) 
    drawingContext.DrawLine(myPen, pointBottomLeft, New Point(pointBottomLeft.X, pointBottomLeft.Y - 5)) 

    drawingContext.DrawLine(myPen, pointBottomRight, New Point(pointBottomRight.X - 5, pointBottomRight.Y)) 
    drawingContext.DrawLine(myPen, pointBottomRight, New Point(pointBottomRight.X, pointBottomRight.Y - 5)) 
    End Sub 

End Class 

Теперь

1) Является ли это лучший способ сделать это, учитывая, что я буду наследовать этот контроль и нужны те же границы на унаследованных управления
2) хорошо ли указать значение по умолчанию для Bor derBrush (быть непрозрачным), как я?
3) Почему мои углы перемещаются с помощью пикселя (на самом деле не правильно связанного)?

ответ

0

Моя попытка ответить на ваши вопросы:

  • Я полагаю, ваше решение в порядке. В качестве альтернативы вы можете создать шаблон управления, который добавит границу вокруг любого элемента управления, который вы внесете внутри. Я полагаю, вам не придется писать больше пользовательских элементов управления для любого элемента управления с помощью границы, но просто поместите любой элемент управления в шаблон. Вы можете найти образец учебника об этом здесь и убедиться, что он соответствует вашим потребностям: http://www.switchonthecode.com/tutorials/wpf-tutorial-custom-control-templates.
  • Я полагаю, что это нормально, но я буду искать какую-то информацию о нем
  • Для того, чтобы изменить углы вы можете изменить значение myPen.LineJoin собственности PenLineJoin.Round. Более подробную информацию о недвижимости можно найти здесь: http://msdn.microsoft.com/en-us/library/system.windows.media.penlinejoin.aspx.

Update: Ответы на Ваш комментарий:

а) создать границу видимой только по углам вы могли бы попробовать использовать простую границу с непрозрачности маски (не проверял это еще хотя)

b) Я полагаю, что метод, который вы использовали, одобрен в вашем случае (однако, если вы сделали шаблонный контроль, это не будет проблемой;)).

c) Извините, моя ошибка. Вы можете попытаться установить StartLineCap и EndLineCap на PenLineCap.Round или PenLineCap.Square значение. Более подробную информацию можно найти на сайте MSDN: http://msdn.microsoft.com/en-us/library/system.windows.media.pen.aspx

+0

Lucas, спасибо за ответы. a) Я не знаю, как установить границу в whitch, но углы будут видны; b) -; c) Насколько я понимаю, LineJoin используется в полигональных строках, но я рисую 8 независимых строк ... * – serhio

+0

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

2

Лучше всего делать это вместо того, чтобы использовать Border класс/контроль создать свой собственный Decorator класс (это в основном то, что Border есть).

+0

как насчет ** наследства ** этого контроля? Граница и Декоратор не наследуются ... а также, я не знаю, как установить границу в whitch, но углы будут видны; – serhio

+0

Если вы посмотрите на исходный код для Border.cs, вы увидите, что он переопределяет методы ArrangeOverride, MeasureOverride и OnRender, которые являются ключевыми для создания собственного типа «Decorator». –