2009-04-23 7 views
2

AutoComplete Quelqu'un peut-il me diriger vers un exemple ou une explication qui me soit aider:Silverlight Watermarked Box

  1. Déployez le SilverLight Box pour permettre AutoComplete filigranes.
  2. Étendez la zone de texte Watermark pour permettre la fonctionnalité de saisie semi-automatique.

Il me semble que l'option 1 serait la plus facile, mais je suis ouvert.

Merci d'avance.

Répondre

5

Dès le départ, je dirais que l'option 1 est bon:

1) Créer une propriété attachée à maintenir la WatermarkText que vous pouvez utiliser sur AutoCompleteBox. 2) Créez un modèle de contrôle pour AutoCompleteBox (copiez simplement celui existant en utilisant blend), mais changez le TextBox en un TextBox Watermark et utilisez un TemplateBinding pour définir la propriété de WatermarkTextBox à la valeur de la propriété attachée. Le modèle de contrôle doit être appliqué dans un style (par exemple WatermarkedAutoCompleteBoxStyle).

Vous devriez être bon pour aller avec cela. Chaque fois que vous voulez une boîte de saisie semi-automatique tatouée, il suffit de définir la valeur de la propriété attachée et d'appliquer le style que vous avez défini.

Si vous avez besoin d'explications plus détaillées sur l'une de ces étapes, il suffit de lever la main et je vais essayer de trouver le temps de créer un échantillon. Alternativement, vous pouvez dériver de AutoCompleteBox, ajouter un DependencyProperty au lieu d'une propriété jointe et empaqueter le style dans le fichier Themes/generic.xaml, mais je le fais habituellement une fois qu'il fonctionne.

+0

LOL ... OK, main officiellement levé. Vous n'avez pas besoin de créer un exemple, mais si vous pouvez pointer vers un bon exemple de # 1. Je n'ai pas encore créé de propriété jointe. Merci! –

+1

En fait, j'ai un exemple d'utilisation d'une propriété jointe pour faire quelque chose de similaire (pas tout à fait, mais il devrait vous montrer la syntaxe) sur http://denis-troller.blogspot.com/ (ce n'est pas une prise, il n'y a en fait que article là-bas :)) –

+0

Denis. Merci beaucoup. Appréciez l'info. –

0

Sur la base de la réponse de Steve:

Public Class WatermarkExtender 
    Inherits DependencyObject 

    Public Shared ReadOnly WatermarkProperty As DependencyProperty = 
     DependencyProperty.RegisterAttached(
      "Watermark", 
      GetType(Object), 
      GetType(WatermarkExtender), 
      New UIPropertyMetadata(Nothing)) 

    Public Shared ReadOnly WatermarkTemplateProperty As DependencyProperty = 
     DependencyProperty.RegisterAttached(
      "WatermarkTemplate", 
      GetType(DataTemplate), 
      GetType(WatermarkExtender), 
      New UIPropertyMetadata(Nothing)) 

    Public Shared Sub SetWatermark(ByVal element As UIElement, ByVal value As Object) 
     element.SetValue(WatermarkProperty, value) 
    End Sub 

    Public Shared Function GetWatermark(ByVal element As UIElement) As Object 
     Return element.GetValue(WatermarkProperty) 
    End Function 

    Public Shared Sub SetWatermarkTemplate(ByVal element As UIElement, ByVal value As Object) 
     element.SetValue(WatermarkTemplateProperty, value) 
    End Sub 

    Public Shared Function GetWatermarkTemplate(ByVal element As UIElement) As Object 
     Return element.GetValue(WatermarkTemplateProperty) 
    End Function 
End Class 

Le style:

<!-- input:AutoCompleteBox --> 
    <Style TargetType="input:AutoCompleteBox"> 
     ... 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="input:AutoCompleteBox"> 
        <Grid Opacity="{TemplateBinding Opacity}"> 
         <extk:WatermarkTextBox 
          Padding="{TemplateBinding Padding}" 
          Background="{TemplateBinding Background}" 
          IsTabStop="True" 
          x:Name="Text" 
          Style="{TemplateBinding TextBoxStyle}" 
          BorderThickness="{TemplateBinding BorderThickness}" 
          BorderBrush="{TemplateBinding BorderBrush}" 
          Foreground="{TemplateBinding Foreground}" 
          Margin="0" 
          Watermark="{Binding Path=(local:WatermarkExtender.Watermark), Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}" 
          WatermarkTemplate="{Binding Path=(local:WatermarkExtender.WatermarkTemplate), Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}" /> 

         ... 
        </Grid> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

Utilisation:

<Window.Resources> 
<Style x:Key="acWatermarkStyle" TargetType="{x:Type wtk:AutoCompleteBox}" BasedOn="{StaticResource {x:Type wtk:AutoCompleteBox}}"> 
      <Setter Property="local:WatermarkExtender.WatermarkTemplate"> 
       <Setter.Value> 
        <DataTemplate> 
         <TextBlock Foreground="Gray" Margin="3,0,0,0" Text="{Binding}" /> 
        </DataTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
</Window.Resources> 

<wtk:AutoCompleteBox 
Height="25" 
Margin="2" 
Style="{StaticResource acWatermarkStyle}" 
HorizontalAlignment="Stretch" 
ValueMemberPath="SomeProp" 
FilterMode="Custom" 
local:WatermarkExtender.Watermark="type something" /> 
+0

Pourriez-vous partager le code pour le WatermarkTextBox aussi s'il vous plaît? –

+1

Bonjour, le WatermarkTextBox est la partie de la boîte à outils étendue WPF: [link] (http://wpftoolkit.codeplex.com/). – pistipanko