代码之家  ›  专栏  ›  技术社区  ›  Einarsson

Silverlight字段集控件

  •  1
  • Einarsson  · 技术社区  · 15 年前

    我错过了Silverlight中HTML的经典字段集,在web上找不到任何解决方案。我该怎么建一个呢?

    2 回复  |  直到 15 年前
        1
  •  1
  •   Einarsson    15 年前

    我想我会做一个。

    这可能不是解决问题的最好方法,但它确实有效,我只是想和大家分享一下,因为感觉其他人可能在寻找同样的东西。

    标记:

    <Controls:Fieldset BorderBrush="#FFcccccc" Legend="LegendHeader" LegendFontSize="14" LegendForeground="Green">
       <Button Content="Button" />
    </Controls:Fieldset>
    

    控件样式:

    <Style TargetType="Controls:Fieldset">
        <Setter Property="Padding" Value="10"/>
        <Setter Property="Margin" Value="10"/>
        <Setter Property="BorderBrush" Value="#FFcccccc"/>
        <Setter Property="Background" Value="Transparent"/>
        <Setter Property="LegendFontSize" Value="14"/>
        <Setter Property="LegendForeground" Value="Black"/>
        <Setter Property="FontSize" Value="14"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="Controls:Fieldset">
                    <Grid x:Name="LayoutRoot" Margin="{TemplateBinding Margin}">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="5"/>
                            <ColumnDefinition Width="20"/>
                            <ColumnDefinition Width="Auto"/>
                            <ColumnDefinition Width="*"/>
                            <ColumnDefinition Width="5"/>
                        </Grid.ColumnDefinitions>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="5"/>
                            <RowDefinition Height="*"/>
                        </Grid.RowDefinitions>
    
                        <Border BorderThickness="1,1,0,0" BorderBrush="{TemplateBinding BorderBrush}" Background="{TemplateBinding Background}" CornerRadius="5,0,0,0"/>
                        <Border Grid.Column="1" BorderThickness="0,1,0,0" BorderBrush="{TemplateBinding BorderBrush}" Background="{TemplateBinding Background}"/>
                        <Border Grid.Column="3" BorderThickness="0,1,0,0" BorderBrush="{TemplateBinding BorderBrush}" Background="{TemplateBinding Background}"/>
                        <Border Grid.Column="4" BorderThickness="0,1,1,0" BorderBrush="{TemplateBinding BorderBrush}" Background="{TemplateBinding Background}" CornerRadius="0,5,0,0"/>
                        <Border Grid.ColumnSpan="5" Grid.Row="1" BorderThickness="1,0,1,1" BorderBrush="{TemplateBinding BorderBrush}" Background="{TemplateBinding Background}" CornerRadius="0,0,5,5"/>
                        <Border Background="{TemplateBinding Background}" Margin="0,1,0,0" Grid.Column="2"/>
                        <Grid  Grid.Column="2" Margin="10,-30,10,-30">
                            <TextBlock HorizontalAlignment="Left" VerticalAlignment="Center" FontSize="{TemplateBinding LegendFontSize}" Foreground="{TemplateBinding LegendForeground}" Text="{TemplateBinding Legend}"/>
                        </Grid>
                        <Border Background="{TemplateBinding Background}" Grid.Row="1" Grid.Column="1" Grid.ColumnSpan="3"/>
                        <ContentPresenter
                            Grid.Column="1" 
                            Grid.ColumnSpan="3" 
                            Grid.Row="1"
                            Margin="{TemplateBinding Padding}" 
                            HorizontalAlignment="Stretch"
                            VerticalAlignment="Stretch"
                            Content="{TemplateBinding Content}" />
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    

    Public Class Fieldset
        Inherits ContentControl
    
        Public Sub New()
        End Sub
    
        Public Shared ReadOnly LegendProperty As DependencyProperty = DependencyProperty.
            Register("Legend", GetType(String), GetType(Fieldset), New PropertyMetadata(AddressOf OnLegendChanged))
    
        Private Shared Sub OnLegendChanged(ByVal d As DependencyObject, ByVal e As DependencyPropertyChangedEventArgs)
            Dim fieldset = TryCast(d, Fieldset)
            fieldset.Legend = e.NewValue.ToString()
        End Sub
    
        Public Property Legend As String
            Get
                Return Me.GetValue(LegendProperty).ToString()
            End Get
            Set(ByVal value As String)
                MyBase.SetValue(LegendProperty, value)
            End Set
        End Property
    
        Public Shared ReadOnly LegendFontSizeProperty As DependencyProperty = DependencyProperty.
            Register("LegendFontSize", GetType(Double), GetType(Fieldset), New PropertyMetadata(AddressOf OnLegendFontSizeChanged))
    
        Private Shared Sub OnLegendFontSizeChanged(ByVal d As DependencyObject, ByVal e As DependencyPropertyChangedEventArgs)
            Dim fieldset = TryCast(d, Fieldset)
            fieldset.LegendFontSize = CDbl(e.NewValue)
        End Sub
    
        Public Property LegendFontSize As Double
            Get
                Return CDbl(Me.GetValue(LegendFontSizeProperty))
            End Get
            Set(ByVal value As Double)
                MyBase.SetValue(LegendFontSizeProperty, value)
            End Set
        End Property
    
        Public Shared ReadOnly LegendForegroundProperty As DependencyProperty = DependencyProperty.
            Register("LegendForeground", GetType(SolidColorBrush), GetType(Fieldset), New PropertyMetadata(AddressOf OnLegendForegroundChanged))
    
        Private Shared Sub OnLegendForegroundChanged(ByVal d As DependencyObject, ByVal e As DependencyPropertyChangedEventArgs)
            Dim fieldset = TryCast(d, Fieldset)
            fieldset.LegendForeground = DirectCast(e.NewValue, SolidColorBrush)
        End Sub
    
        Public Property LegendForeground As SolidColorBrush
            Get
                Return DirectCast(Me.GetValue(LegendForegroundProperty), SolidColorBrush)
            End Get
            Set(ByVal value As SolidColorBrush)
                MyBase.SetValue(LegendForegroundProperty, value)
            End Set
        End Property
    End Class
    

    我为VB.NET代码道歉。

    正如我所说,可能有很多更好的解决方案,但这里。