2012-03-07 118 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)相同的邊框是好到指定博爾的默認值derBrush(不透明),像我一樣?
3)爲什麼我的角落移動像素(不是很正確的鏈接)?

回答

0

我在回答你的問題的嘗試:

更新: 解答您的評論:

一)建立邊境只有在轉彎時,你可以嘗試使用帶有不透明蒙一個簡單的邊框可見(沒有測試尚未雖然)

b)我想你使用的方法是可以的(但是,如果你製作了模板控件,這不會是一個問題;))。

c)對不起,我的錯。您可以嘗試設置StartLineCapEndLineCapPenLineCap.RoundPenLineCap.Square的值。更多信息可在MSDN上找到:http://msdn.microsoft.com/en-us/library/system.windows.media.pen.aspx

+0

盧卡斯,謝謝你的回答。 a)我不知道如何設置邊界,但角落可見; b) - ; c)據我所知,LineJoin用於poligonal線,但我畫了8條獨立線...... * – serhio 2012-03-08 08:43:39

+0

沒問題,我希望我的回答對你有幫助。我已更新它包含aswers評論。 – 2012-03-08 20:03:05

2

一個更好的事情是不是使用Border類/控制的創建自己的Decorator類(即本質上是一個Border是什麼)。

+0

這個控件的**繼承**怎麼樣?邊界和裝飾器不會被繼承...而且,我不知道如何設置邊框,但角落是可見的; – serhio 2012-03-08 08:39:11

+0

如果您查看Border.cs的源代碼,那麼您會看到它覆蓋了'ArrangeOverride','MeasureOverride'和'OnRender'方法,這些方法是創建您自己的'Decorator'類型的關鍵。 – 2012-03-08 15:10:43