<Grid> <Border HorizontalAlignment="Center" VerticalAlignment="Center" Width="60" Height="30" CornerRadius="5" BorderBrush="Blue" BorderThickness="3"> <TextBlock Text="aaa" HorizontalAlignment="Center" VerticalAlignment="Center"/> </Border> </Grid>
看看效果:
一個中規中矩的實線框,如何改造成我們想要的虛線框哪?
第一個想到的就是修改Border的Brush,來看看這樣的xaml:
<Grid> <Border HorizontalAlignment="Center" VerticalAlignment="Center" Width="60" Height="30" CornerRadius="5" BorderThickness="3"> <Border.BorderBrush> <LinearGradientBrush SpreadMethod="Repeat" StartPoint="0,5" EndPoint="5,0" MappingMode="Absolute"> <LinearGradientBrush.GradientStops> <GradientStop Color="Blue" Offset="0"/> <GradientStop Color="Blue" Offset="0.2"/> <GradientStop Color="Transparent" Offset="0.4"/> <GradientStop Color="Transparent" Offset="0.6"/> <GradientStop Color="Blue" Offset="0.8"/> <GradientStop Color="Blue" Offset="1"/> </LinearGradientBrush.GradientStops> </LinearGradientBrush> </Border.BorderBrush> <TextBlock Text="aaa" HorizontalAlignment="Center" VerticalAlignment="Center"/> </Border> </Grid>
看看效果圖:
因為把Brush修改成斜線的漸變色(藍色->透明->藍色),因此總體上看起來就是個虛線,但是在圓角的效果取有些不怎么如意。
再換個思路,更換為使用DrawingBrush:
<Grid> <Border HorizontalAlignment="Center" VerticalAlignment="Center" Width="60" Height="30" CornerRadius="5" BorderThickness="3"> <Border.BorderBrush> <DrawingBrush> <DrawingBrush.Drawing> <GeometryDrawing> <GeometryDrawing.Pen> <Pen Brush="Blue" Thickness="3"> <Pen.DashStyle> <DashStyle Dashes="3,2,0,2"/> </Pen.DashStyle> </Pen> </GeometryDrawing.Pen> <GeometryDrawing.Geometry> <RectangleGeometry Rect="0,0,60,30" RadiusX="3" RadiusY="3"/> </GeometryDrawing.Geometry> </GeometryDrawing> </DrawingBrush.Drawing> </DrawingBrush> </Border.BorderBrush> <TextBlock Text="aaa" HorizontalAlignment="Center" VerticalAlignment="Center"/> </Border> </Grid>
看看效果圖:
利用Pen的DashStyle可以輕易的實現點划的虛線圖,當然也可以輕易實現點點划的虛線,DashStyle的規則為:實線長度,空線長度,實線長度,空線長度…,而實現長度如果為0,就代表點。
不過細看這張圖的話,還是會發現一些不和諧的東西,圓角從外側看,確實是圓的,但是仔細看內側的話,發現其內側竟然是個直角。。。
好吧,換個思路,放棄Border了,直接用Canvas,加Rectange:
<Grid> <Grid HorizontalAlignment="Center" VerticalAlignment="Center" Width="60" Height="30"> <Canvas> <Rectangle RadiusX="5" RadiusY="5" Width="60" Height="30" Stroke="Blue" StrokeDashArray="5,2,1,2" StrokeThickness="2"/> </Canvas> <TextBlock Text="aaa" HorizontalAlignment="Center" VerticalAlignment="Center"/> </Grid> </Grid>
看看效果圖:
看起來還不錯,確實是圓角的,不過這后面兩個方案也有個明顯的缺點,就是無法隨着文本框內容的增長而動態的繪制。當然可以用Binding來進一步消除這個問題:
<Grid>
<Grid HorizontalAlignment="Center" VerticalAlignment="Center" Width="60" Height="30" x:Name="g">
<Canvas>
<Rectangle RadiusX="5" RadiusY="5"
Width="{Binding ElementName=g, Path=Width}"
Height="{Binding ElementName=g, Path=Height}"
Stroke="Blue" StrokeDashArray="5,2,1,2" StrokeThickness="2"/>
</Canvas>
<TextBlock Text="aaa" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Grid>
</Grid>
效果圖:
看起來還不錯,不過這個方案還是存在問題的,如果容器Grid本身是自增長的,那么杯具就開始了:
<Grid>
<Grid HorizontalAlignment="Center" VerticalAlignment="Center" x:Name="g">
<Canvas>
<Rectangle RadiusX="5" RadiusY="5"
Width="{Binding ElementName=g, Path=Width}"
Height="{Binding ElementName=g, Path=Height}"
Stroke="Blue" StrokeDashArray="5,2,1,2" StrokeThickness="2"/>
</Canvas>
<TextBlock Text="aaa" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Grid>
</Grid>
效果圖:
可以發現,Grid使用了自增長的方式,Binding也只能獲得錯誤的Width和Height,也就是0,不過別擔心,WPF還提供了ActualWidth和ActualHeight:
<Grid>
<Grid HorizontalAlignment="Center" VerticalAlignment="Center" x:Name="g">
<Canvas>
<Rectangle RadiusX="5" RadiusY="5"
Width="{Binding ElementName=g, Path=ActualWidth}"
Height="{Binding ElementName=g, Path=ActualHeight}"
Stroke="Blue" StrokeDashArray="5,2,1,2" StrokeThickness="2"/>
</Canvas>
<TextBlock Margin="10,7,10,7" Text="aaa" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Grid>
</Grid>
效果圖:
哈哈,圓滿達成目標。
文中的方案為原型,如果要實用,還是建議用上模板:
<Style TargetType="ContentControl" x:Key="myBorder">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<Grid x:Name="g"
Background="{TemplateBinding ContentControl.Background}"
Width="{TemplateBinding ContentControl.Width}"
Height="{TemplateBinding ContentControl.Height}">
<Canvas>
<Rectangle RadiusX="5" RadiusY="5"
Width="{Binding ElementName=g, Path=ActualWidth}"
Height="{Binding ElementName=g, Path=ActualHeight}"
Stroke="{TemplateBinding ContentControl.BorderBrush}"
StrokeDashArray="5,2,1,2"
StrokeThickness="{TemplateBinding ContentControl.BorderThickness}"/>
</Canvas>
<ContentPresenter Margin="5" Content="{TemplateBinding ContentControl.Content}"/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
然后就可以這樣使用:
<ContentControl Margin="10" HorizontalAlignment="Center" VerticalAlignment="Center"
BorderThickness="2" BorderBrush="Blue" Style="{StaticResource myBorder}">
<TextBlock Text="abc"/>
</ContentControl>
<ContentControl Margin="10" HorizontalAlignment="Center" VerticalAlignment="Center"
BorderThickness="3" BorderBrush="Red" Style="{StaticResource myBorder}">
<CheckBox>check box</CheckBox>
</ContentControl>
<Button Margin="10" HorizontalAlignment="Center" VerticalAlignment="Center">
<ContentControl BorderThickness="1" BorderBrush="Green" Style="{StaticResource myBorder}">
check box
</ContentControl>
</Button>
原文地址:http://www.cnblogs.com/vwxyzh/archive/2011/12/17/2291256.html








