2010-05-12 9 views
7

के समान WPF प्रॉपर्टी पैनल बस सोच रहा है कि उनके किसी भी उदाहरण या तत्व हैं जो विजुअल स्टूडियो में प्रयुक्त प्रॉपर्टी पैनल के समान दिख सकते हैं? मेरा अनुमान है कि विजुअल स्टूडियो 2010 में से एक WPF पर बनाया गया है, लगभग निश्चित रूप से एक वृक्षदृश्य?विजुअल स्टूडियो के

+0

उस पर +1 - मुझे भी एक की आवश्यकता है;) – TomTom

उत्तर

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 में काम करने के लिए अच्छा है क्योंकि आप पैरामीटर्स संग्रह में किसी भी प्रकार की ऑब्जेक्ट जोड़ सकते हैं जब तक कि इसमें कोई श्रेणी, प्रदर्शन नाम और विवरण हो।

यदि आप इसे किसी विशेष वस्तु के गुणों को वास्तव में प्रदर्शित करने के लिए उपयोग करना चाहते हैं, तो उचित ऑब्जेक्ट्स के साथ पैरामीटर संग्रह को लोड करने में केवल कुछ पंक्तियां होती हैं।

+0

मैंने इस कोड को एक खाली प्रोजेक्ट में संकलित करने का प्रयास किया है, और पैरामीटर्स ऑब्जेक्ट में डेटासेट बांध लिया है। हालांकि मुझे त्रुटि मिलती है 'सिस्टम पर मूल्य प्रदान करें' सिस्टम। Windows.StaticResourceExtension 'ने अपवाद फेंक दिया।' शुरुआत में। ग्रिड परिभाषा पर तोड़ता है; wonea

+0

''