WPF Accordion VerticalAlignment bug - PullRequest
       14

WPF Accordion VerticalAlignment bug

2 голосов
/ 27 сентября 2010


Используя элемент управления Accordion из последнего набора инструментов WPF, я столкнулся с этой проблемой. Когда для элемента управления Accordion VerticalAlignment установлено значение «Растянуть», содержащиеся в нем AccordionItems больше не будут расширяться, если для SelectionMode установлено значение «Один». Если режим выбора установлен на «ZeroOrOne», вы получаете расширение после нескольких попыток нажатия. Если для него установлено значение «ZeroOrMore», то происходит нечто действительно прикольное, когда аккордеонные предметы пропадают в нижней части экрана!

Кто-нибудь нашел решение этой проблемы?

Спасибо!

Ответы [ 3 ]

1 голос
/ 08 октября 2010

Вы также можете установить для свойства Accordion SelectionSequence значение CollapseBeforeExpand.

Эта ошибка связана с проблемами синхронизации анимации расширения / свертывания каждого элемента аккордеона (когда расширение и свертывание происходят одновременно) с обновление макета Аккордеона, которое портит размер, доступный для расширения.

1 голос
/ 11 января 2018

Прежде всего, я прошу прощения за повторную активацию очень старой темы, но следующий код может проиллюстрировать ответ TerrorAustralis.

Свойство Heigth части 1 ScrollViewer зависит от ActualHeigth Аккордеона.Для более детальной настройки вы можете изменить значение ConverterParameter.

<UserControl ...
         xmlns:local="clr-namespace:MyProject.namespace.converters"
         xmlns:lTk="clr-namespace:System.Windows.Controls;assembly=DotNetProjects.Layout.Toolkit">
                <lTk:Accordion HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
                    <lTk:Accordion.Resources>
                        <local:RemoveMarginConverter x:Key="RemoveMarginConverter"/>
                        <Style TargetType="lTk:AccordionItem">
                            <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
                            <Setter Property="VerticalContentAlignment" Value="Stretch"/>
                        </Style>
                    </lTk:Accordion.Resources>
                    <lTk:AccordionItem Header="Part 1">
                        <ScrollViewer VerticalScrollBarVisibility="Auto" Background="White"
                                      Height="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type lTk:Accordion}},
                                                Path=ActualHeight, Converter={StaticResource RemoveMarginConverter}, ConverterParameter=px50}">
<!-- Part 1 content -->
                        </ScrollViewer>
                    </lTk:AccordionItem>
                    <lTk:AccordionItem Header="Part 2">
                        <ScrollViewer VerticalScrollBarVisibility="Auto" Background="White">
<!-- Part 2 content -->
                        </ScrollViewer>
                    </lTk:AccordionItem>
                </lTk:Accordion>
</UserControl>

и код конвертера:

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Data;

namespace MyProject.namespace.converters
{
    public class RemoveMarginConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            var val = System.Convert.ToInt32(value);
            var margin = System.Convert.ToInt32(parameter.ToString().Replace("px", ""));
            return val - margin;
        }
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
}
1 голос
/ 28 сентября 2010

Обходной путь OK - связать ActualHeight и ActualWidth с родительским элементом, который вы хотите заполнить. Это что-то вроде хака, но это сработает.

...