stackpanel مع المتوسع متعددة
-
18-09-2019 - |
سؤال
انا املك StackPanel
مع المتعدد Expander
س:
<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
(ق) يمكن توسيعها - واحد فقط
Expander
يمكن أن تكون نشطة (تغيير خلفية رأس) - النشطة
Expander
سوف تتغير إذا قمت بتحديد آخرExpander
داخل اللوحة ولكن إذا قمت بتحديد آخرExpander
أو عناصر تحكم أخرى خارج لوحة نشطExpander
يبقى
كيف يمكنني تحقيق ذلك؟
المحلول
أضفهم إلى 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);
}
}
}
}
انظر إجابتي إلى هذا المنشور ما الكود الذي خلفه القانون: رابط النص
لا تنتمي إلى StackOverflow