2010-05-12 9 views
7

Solo me pregunto si sus ejemplos o elementos pueden parecer muy similares al panel de propiedades utilizado en Visual Studio. ¿Creo que el de Visual Studio 2010 está basado en WPF, casi definitivamente una vista de árbol?WPF Properties Panel similar a Visual Studio

+0

+1 en eso - también necesito uno;) – TomTom

Respuesta

3

Si desea utilizar alguna XAML simple, el siguiente es visualmente idéntica a la de Windows Forms PropertyGrid pero es mucho más fácil trabajar con:

<Style x:Key="InnerBorder" TargetType="{x:Type Border}"> 
    <Setter Property="BorderThickness" Value="1" /> 
    <Setter Property="Margin" Value="4" /> 
    <Setter Property="BorderBrush" Value="#B4B0A8" /> 
</Style> 

<Grid> 

    <Grid.RowDefinitions> 
    <RowDefinition /> 
    <RowDefinition Height="Auto" /> 
    </Grid.RowDefinitions> 

    <!-- Main property grid area --> 
    <Border Style="{StaticResource InnerBorder}"> 
    <ListBox 
     ItemsSource="{Binding Parameters}" 
     IsSynchronizedWithCurrentItem="True" 
     KeyboardNavigation.TabNavigation="Continue" 
     HorizontalContentAlignment="Stretch" BorderThickness="0"> 

     <!-- Category grouping rows --> 
     <ListBox.GroupStyle> 
     <GroupStyle> 
      <GroupStyle.HeaderTemplate> 
      <DataTemplate> 
       <TextBlock Text="{Binding Name}" Background="#D4D0C8" FontWeight="Bold" Padding="2 2 0 4" Margin="0 0 0 3"/> 
      </DataTemplate> 
      </GroupStyle.HeaderTemplate> 
      <GroupStyle.ContainerStyle> 
      <Style> 
       <Setter Property="Control.Margin" Value="0 0 0 8" /> 
      </Style> 
      </GroupStyle.ContainerStyle> 
     </GroupStyle> 
     </ListBox.GroupStyle> 

     <!-- Item container style --> 
     <ListBox.ItemContainerStyle> 
     <Style TargetType="ListBoxItem"> 
      <Setter Property="Focusable" Value="False" /> 
      <Setter Property="TabIndex" Value="0" /> 
      <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type ListBoxItem}"> 

       <DockPanel Margin="4 0 0 0" IsKeyboardFocusWithinChanged="DockPanel_IsKeyboardFocusWithinChanged" MouseDown="DockPanel_MouseDown"> 
        <TextBlock Name="TitleBlock" Text="{Binding DisplayName}" Width="135" /> 
        <ContentPresenter /> 
       </DockPanel> 

       <ControlTemplate.Triggers> 
        <Trigger Property="IsSelected" Value="true"> 
        <Setter TargetName="TitleBlock" Property="Background" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}" /> 
        <Setter TargetName="TitleBlock" Property="Foreground" Value="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}" /> 
        </Trigger> 
       </ControlTemplate.Triggers> 

       </ControlTemplate> 
      </Setter.Value> 
      </Setter> 
     </Style> 
     </ListBox.ItemContainerStyle> 

    </ListBox> 
    </Border> 

    <!-- Help area --> 
    <Border Style="{StaticResource InnerBorder}" Grid.Row="1" DataContext="{Binding Parameters}"> 
    <StackPanel HorizontalAlignment="Stretch" Margin="2"> 
     <TextBlock FontWeight="Bold" Text="{Binding /DisplayName}" /> 
     <TextBlock Text="{Binding /Description}" TextWrapping="Wrap" /> 
    </StackPanel> 
    </Border> 

</Grid> 

Y aquí es el código detrás

private void DockPanel_IsKeyboardFocusWithinChanged(object sender, DependencyPropertyChangedEventArgs e) 
{ 
    var element = (FrameworkElement)sender; 
    if(element.IsKeyboardFocusWithin) 
    { 
    Visual cur = element; 
    while(cur!=null && !(cur is ListBoxItem)) 
     cur = (Visual)VisualTreeHelper.GetParent(cur); 
    ((ListBoxItem)cur).IsSelected = true; 
    } 
} 

private void DockPanel_MouseDown(object sender, MouseEventArgs e) 
{ 
    ((FrameworkElement)sender).MoveFocus(new TraversalRequest(FocusNavigationDirection.First)); 
} 

private void InitializeView() 
{ 
    var view = CollectionViewSource.GetDefaultView(Parameters); 
    if(view.GroupDescriptions.Count==0) 
    view.GroupDescriptions.Add(new PropertyGroupDescription("Category")); 

    if(view.SortDescriptions.Count==0) 
    { 
    view.SortDescriptions.Add(new SortDescription("Category", ListSortDirection.Ascending)); 
    view.SortDescriptions.Add(new SortDescription("DisplayName", ListSortDirection.Ascending)); 
    } 
} 

La razón por la que esta cuadrícula de propiedad es más agradable para trabajar en WPF es que puede agregar cualquier tipo de objeto a la colección Parameters, siempre que tenga una Categoría, Nombre para mostrar y Descripción.

Si desea utilizarlo para mostrar realmente las propiedades de un objeto específico, bastarán unas pocas líneas para cargar la colección de Parámetros con los objetos apropiados.

+0

He intentado compilar este código, en un proyecto vacío, y he vinculado un conjunto de datos al objeto Parámetros. Sin embargo, obtengo el error 'Provide value on' System.Windows.StaticResourceExtension 'lanzó una excepción'. en el arranque. Se rompe en la definición de la grilla; wonea

+0

El ''