Управление полями Silverlight - PullRequest
1 голос
/ 05 ноября 2010

Мне не хватает классического Fieldset HTML в Silverlight, и я не могу найти какие-либо решения в Интернете. Как мне построить один?

Ответы [ 2 ]

1 голос
/ 05 ноября 2010

Я подумал, что построю один.

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

Простое решение, вы можете установить FontSize, Foreground и заголовок легенды.

Markup:

<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.

Как я уже сказал, возможно, есть много лучших решений, но здесь все идет.

0 голосов
/ 05 ноября 2010

Мне известны два варианта:

  1. Используйте бесплатный сторонний элемент управления Fieldset:
    http://www.vectorlight.net/silverlight/controls/fieldset.aspx
    http://www.vectorlight.net/silverlight/controls/fieldset/reference.aspx

  2. Рассмотрите возможность использования DataForm с дополнительными функциями, специфичными для формы:
    http://www.silverlightshow.net/items/Creating-Rich-Data-Forms-in-Silverlight-3-Introduction.aspx

...