2010-05-12 77 views
7

只是想知道他们的任何示例或元素可以看起来非常类似于Visual Studio中使用的属性面板?我猜想Visual Studio 2010中的一个是建立在WPF之上的,几乎肯定是一个treeview?WPF属性面板类似于Visual Studio的

+0

+1 - 我也需要一个;) – TomTom 2010-05-12 16:13:09

回答

3

如果你想使用一些简单的XAML,以下是视觉上相同的的WinForms PropertyGrid的,但更容易使用的工作:

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

这里是背后

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

此属性网格更适合在WPF中使用的原因是,只要具有类别,显示名称和说明,您就可以将任何类型的对象添加到参数集合中。

如果您想使用它来实际显示特定对象的属性,只需要几行就可以使用适当的对象加载Parameters集合。

+0

我已经尝试编译这个代码,在一个空的项目中,并将数据集绑定到Parameters对象。不过,我得到'System.Windows.StaticResourceExtension提供的值'的错误引发了一个异常。'在启动。打破网格定义; wonea 2010-05-13 10:23:27

+0

的''