2009-09-29 78 views
0

我有一個StackPanel多個Expander S:StackPanel中有多個擴展

<StackPanel Margin="0,10,0,0"> 
    <Expander Header="Test 1"> 
     <ListBox> 
      <ListBoxItem Content="Unit 1"/> 
      <ListBoxItem Content="Unit 2"/> 
     </ListBox> 
    </Expander> 
    <Expander Header="Test 2"> 
     <ListBox> 
      <ListBoxItem Content="Unit 3"/> 
      <ListBoxItem Content="Unit 4"/> 
     </ListBox> 
    </Expander> 
</StackPanel> 

我想要實現這些行爲:

  • 一個或兩個Expander(S)可以擴展
  • 只有一個Expander可能是活動的(更改標題背景)
  • 活動如果我選擇另一Expander面板內但是如果我選擇面板以外的其他Expander或其他控制活動Expander停留

我怎樣才能做到這一點會改變嗎?

回答

1

將它們添加到ListControl而不是StackPanel。 ListControls支持選擇一個項目。

XAML:

<Window x:Class="ExpanderTest.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Height="300" Width="300"> 

    <Window.Resources> 

     <Style TargetType="ListBoxItem"> 
      <Style.Resources> 
       <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Red"/> 
       <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="Red"/> 
      </Style.Resources> 

     </Style> 

    </Window.Resources> 

    <StackPanel Margin="0,10,0,0"> 
     <ListBox SelectedIndex="1"> 
      <ListBoxItem HorizontalContentAlignment="Stretch"> 
       <Expander Header="Test 1"> 
        <ListBox> 
         <ListBoxItem Content="Unit 1"/> 
         <ListBoxItem Content="Unit 2"/> 
        </ListBox> 
       </Expander> 
      </ListBoxItem> 
      <ListBoxItem HorizontalContentAlignment="Stretch"> 
       <Expander Header="Test 2" > 
        <ListBox> 
         <ListBoxItem Content="Unit 3"/> 
         <ListBoxItem Content="Unit 4"/> 
        </ListBox> 
       </Expander> 
      </ListBoxItem> 
     </ListBox> 
    </StackPanel> 

</Window> 

後面的代碼:

using System; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Media; 

namespace ExpanderTest 
{ 
    public partial class Window1 : Window 
    { 
     public Window1() 
     { 
      InitializeComponent(); 

      EventManager.RegisterClassHandler(typeof(UIElement), 
             GotFocusEvent, 
             new RoutedEventHandler(OnGotFocus)); 
     } 

     private static void OnGotFocus(object sender, RoutedEventArgs e) 
     { 
      // Check if element that got focus is contained by a listboxitem and 
      // in that case selected the listboxitem. 

      DependencyObject parent = e.OriginalSource as DependencyObject; 
      while (parent != null) 
      { 
       ListBoxItem clickedOnItem = parent as ListBoxItem; 
       if (clickedOnItem != null) 
       { 
        clickedOnItem.IsSelected = true; 
        return; 
       } 

       parent = VisualTreeHelper.GetParent(parent); 
      } 
     } 
    } 
} 

見我回答這個職位有什麼背後的代碼所做的:link text