2012-09-20 1 views
1

Я хочу реализовать это в Silverlight.Настройка шаблона управления Silverlight Combobox

выпадающий с инлайн фильтром во всплывающем окне

http://gregandora.wordpress.com/2012/01/25/filtering-items-in-a-wpf-combobox/

К сожалению, это для WPF и XAML не совместимы. Его очень сложно преобразовать или понять, как изменить шаблон управления combobox.

Любая идея?

ответ

1

Вот демо решения: https://dl.dropbox.com/u/8424800/StackOverflowSl.html (см ComboBox фильтр)

Я взял шаблон Silverlight ComboBox по умолчанию и добавил «FilterTextBox» в разделе Popup. Я не мог опубликовать весь xaml, поскольку он превысил лимит StackOverflow. Полными источниками являются here as a GitHub Gist. Я ушел в важные части. Затем необходимо подключить обработчики событий в TextBox.

<Style TargetType="ComboBox"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="ComboBox"> 
       <Grid>      
        <Popup x:Name="Popup"> 
         <Border x:Name="PopupBorder" 
           Height="Auto" 
           HorizontalAlignment="Stretch" 
           BorderBrush="{TemplateBinding BorderBrush}" 
           BorderThickness="{TemplateBinding BorderThickness}" 
           CornerRadius="3"> 
          <Border.Background> 
           <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1"> 
            <GradientStop Offset="0" Color="#FFFFFFFF" /> 
            <GradientStop Offset="1" Color="#FFFEFEFE" /> 
           </LinearGradientBrush> 
          </Border.Background> 
          <Grid> 
           <TextBox x:Name="FilterTextBox" 
              Height="22" 
              VerticalAlignment="Top" /> 
           <ScrollViewer x:Name="ScrollViewer" 
               Margin="0,25,0,0" 
               BorderThickness="0" 
               Padding="1"> 
            <ItemsPresenter /> 
           </ScrollViewer> 
          </Grid> 
         </Border> 
        </Popup> 
       </Grid> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

разводку TextBox

public Q12513294() 
{ 
    // Required to initialize variables 
    InitializeComponent(); 

    InitializeMyCombo(
     Enumerable.Range(1, 99).Select(x => "Beer " + x.ToString() + " on the wall"), 
     (object item, string filter) => (item as String).Contains(filter) 
    ); 
} 

private void InitializeMyCombo(IEnumerable items, Func<object, string, bool> filter) 
{ 
    MyComboBox.Loaded += (s, e) => 
    { 
     // PagedCollectionView implements a filterable collection 
     PagedCollectionView list = new PagedCollectionView(items); 
     MyComboBox.ItemsSource = list; 

     // Set the filter based on the contents of the textbox 
     TextBox filterTextBox = MyComboBox.GetTemplateChild<TextBox>("FilterTextBox"); 
     list.Filter = new Predicate<object>(
      item => filter(item, filterTextBox.Text) 
      ); 

     // Refresh the filter each time 
     filterTextBox.TextChanged += (s2, e2) => 
     { 
      list.Refresh(); 
      filterTextBox.Focus(); 
     }; 
    }; 

} 

public static class Helper 
{ 
    public static T GetTemplateChild<T>(this DependencyObject parent, string partName) 
    { 
     return (T)(VisualTreeHelper.GetChild(parent, 0) as Panel).FindName(partName); 
    } 
}