2009-04-23 118 views
2

有人能告訴我一個例子或說明,這將有助於我可以:Silverlight的水印自動完成框

  1. 擴展Silverlight的自動完成框,以允許水印。
  2. 擴展水印文本框以允許自動完成功能。

這讓我覺得,選項1是最簡單的,但我是開放的。

在此先感謝。

回答

5

馬上蝙蝠,我想說的選項1是不錯的:

1)創建附加屬性來保存,你可以AutoCompleteBox使用WatermarkText。

2)爲AutoCompleteBox創建控件模板(只需使用混合複製現有的控件),但將TextBox更改爲Watermark TextBox,並使用TemplateBinding將WatermarkTextBox的屬性設置爲附加屬性的值。 控件模板應該以樣式應用(例如WatermarkedAutoCompleteBoxStyle)。

你應該很好的去與此。 任何時候你想要一個帶水印的自動填充框,只需設置附加的屬性值並應用你定義的樣式。

如果您需要更深入地解釋其中一個步驟,請舉手,我會嘗試找到創建樣本的時間。

或者,您可以從AutoCompleteBox派生,添加一個DependencyProperty而不是附加屬性,並將樣式封裝在Themes/generic.xaml文件中,但我通常在它工作後執行它。

+0

LOL ... OK,手正式提出。您不必創建示例,但是如果您可以指向#1的良好示例。我還沒有實際創建一個附加的財產。謝謝! – 2009-04-23 19:30:44

+1

實際上,我有一個使用附加屬性在http://denis-troller.blogspot.com/上做類似(不完全,但應該顯示你的語法)的例子(它不是一個插件,實際上只有這個那邊的文章:)) – 2009-04-23 19:52:36

0

基於史蒂夫的回答是:

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 

風格:

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

用法:

<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" />