2010-05-12 15 views
7

Fragen Sie sich einfach ihre Beispiele oder Elemente, die dem in Visual Studio verwendeten Eigenschaftenfenster sehr ähnlich sein können? Meine Vermutung, dass die in Visual Studio 2010 auf WPF basiert, fast definitiv eine Baumansicht?WPF-Eigenschaftenfenster ähnlich wie bei Visual Studio

+0

+1 auf das - ich brauche auch eins;) – TomTom

Antwort

3

Wenn Sie einige einfache XAML verwenden möchten, die folgende ist optisch identisch mit dem WinForms Property ist aber viel einfacher zu handhaben:

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

Und hier ist der Code hinter

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)); 
    } 
} 

Der Grund, warum dieses Eigenschaftsraster in WPF besser funktioniert, ist, dass Sie der Parameters-Auflistung jedes beliebige Objekt hinzufügen können, solange es über eine Kategorie, einen DisplayName und eine Beschreibung verfügt.

Wenn Sie die Eigenschaften eines bestimmten Objekts anzeigen möchten, dauert es nur ein paar Zeilen, um die Parameter-Sammlung mit den entsprechenden Objekten zu laden.

+0

Ich habe versucht, diesen Code in einem leeren Projekt zu kompilieren, und eine Datenmenge an das Objekt Parameter gebunden. Allerdings bekomme ich den Fehler 'Geben Sie Wert für' System.Windows.StaticResourceExtension 'warf eine Ausnahme.' beim Start. Bricht die Rasterdefinition ab; wonea

+0

Der ''