Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WPF, Silverlight Новый топик    Ответить
 Определить разные стили контрола в зависимости от степени его вложения в другие контролы  [new]
Vladimir2008
Member

Откуда:
Сообщений: 8
Есть разметка XAML:
<GroupBox>
     <StackPanel>
          <StackPanel>
               здесь контролы
          </StackPanel>
     </StackPanel>
<GroupBox>

Как описать стиль для StackPanel (возможно, на основе триггеров), чтобы установить свойство Margin для StackPanel в зависимости от степени его вложенности в GroupBox (без указания ключа x:Key стиля - т.е. чтобы действовал на все StackPanel)?
Т.е., для GroupBox/StackPanel (для него Margin=5) и GroupBox/StackPanel/StackPanel (для него Margin=10)?
9 фев 17, 14:44    [20196954]     Ответить | Цитировать Сообщить модератору
 Re: Определить разные стили контрола в зависимости от степени его вложения в другие контролы  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 4030
Через триггеры такое делать гемомрой, лучше через Converter и визуальное дерево, либо MarkupExtension
9 фев 17, 14:55    [20197009]     Ответить | Цитировать Сообщить модератору
 Re: Определить разные стили контрола в зависимости от степени его вложения в другие контролы  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 4030
    public class MarginConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            var uiElement = value as FrameworkElement;
            var multiply = string.IsNullOrEmpty((string)parameter) ? 1 : System.Convert.ToInt32(parameter);
            if (uiElement == null) throw new NotSupportedException();
            var depth = GetDepth(uiElement);
            return new Thickness(depth * multiply);
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }

        private static int GetDepth(DependencyObject uiElement)
        {
            var element = uiElement;
            int index = 0;
            while ((element = VisualTreeHelper.GetParent(element)) != null)
            {
                index++;
            }
            return index;
        }
    }


    <Window.Resources>
        <local:MarginConverter x:Key="MarginConverter"/>
        <Style TargetType="{x:Type Grid}">
            <Setter Property="Margin" Value="{Binding RelativeSource={RelativeSource Self}, Converter={StaticResource MarginConverter}, ConverterParameter=10}"/>
        </Style>
    </Window.Resources>
    <Grid Background="Green">
        <Grid Background="Red">
            <Grid Background="Blue">
                <Grid Background="Orange">
                    <Grid Background="Yellow">
                        <Grid Background="Silver">

                        </Grid>
                    </Grid>
                </Grid>
            </Grid>
        </Grid>
    </Grid>
9 фев 17, 15:11    [20197091]     Ответить | Цитировать Сообщить модератору
Все форумы / WPF, Silverlight Ответить