Stackpanel有多个扩展器

时间:2009-09-29 12:31:05

标签: wpf stackpanel expander

我有一个StackPanel多个Expander s:

<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或该面板外的其他控件,则有效Expander会停留< / LI>

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分: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