Matt T Heffron Ответов: 1

Как бы стиль сохранить свойства содержимого набор в стиле по?


Я пытаюсь определить иерархию стилей кнопок и хотел бы иметь возможность устанавливать значения свойств в производном стиле без потери значения содержимого, установленного в родитель Стиль.

Что я уже пробовал:

Вот упрощенный" корневой " стиль:
<Style x:Key="CircleButtonStyle"
       TargetType="{x:Type Button}">
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="{x:Type Button}">
        <Grid>
          <Ellipse x:Name="Circle"
                   StrokeThickness="0"
                   Stretch="Uniform"
                   Fill="{StaticResource myCustomBrush}" />
          <ContentPresenter HorizontalAlignment="Stretch"
                            VerticalAlignment="Stretch" />
        </Grid>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>

Вот упрощенный первый полученный стиль:
<Style x:Key="CircleCrossStyle"
       TargetType="{x:Type Button}"
       BasedOn="{StaticResource CircleButtonStyle}">
  <Setter Property="Content">
    <Setter.Value>
        <Grid>
          <Path Stroke="White"
                Stretch="Uniform"
                Margin="0.5"
                Data="M 1 1 H 0 M 1 1 H 2 M 1 1 V 0 M 1 1 V 2"
                VerticalAlignment="Stretch"
                HorizontalAlignment="Stretch" />
        </Grid>
    </Setter.Value>
  </Setter>
</Style>

Вышеперечисленное сработало. Теперь я хочу иметь такой же стиль, за исключением поворота всего этого на 45°. Я пытался:
<Style x:Key="CircleXStyle"
       TargetType="{x:Type Button}"
       BasedOn="{StaticResource CircleCrossStyle}">
  <Setter Property="RenderTransformOrigin"
          Value="0.5,0.5" />
  <Setter Property="RenderTransform">
    <Setter.Value>
      <RotateTransform Angle="45" />
    </Setter.Value>
  </Setter>
</Style>

Я не знаю, почему это не сработало, но он вообще не показывал путь.
Я удалил сеттеры и, используя этот стиль, все еще не показывал путь.

Как сохранить / распространить набор содержимого в CircleCrossStyle, чтобы добавить эффект вращения в CircleXStyle? (Или это невозможно, используя только стили?)

Больше исследований:
Я использовал это на кнопке в столбце DataGridTemplateColumn.CellTemplate. Вместо этого я попытался сослаться на стиль CircleCrossStyle. Этот стиль также используется на кнопке под DataGrid. Когда я это сделал, стиль CircleCrossStyle был правильно использован только на последнем ряду сетки! И другая кнопка, которая использовала этот стиль, теперь показывалась с отсутствующим путем, как и все остальные. другой строки Датагрида!
Я изменил стиль обратно на CircleXStyle без сеттеров, и он вел себя точно так же. Только в последнем ряду был стиль CircleCrossStyle, а на другой кнопке был только круг. (По-видимому, раньше я этого не замечал.)
Я попытался скопировать тот же самый сеттер контента из Circlecrosstyle в CircleXStyle и изменил его на производный от CircleButtonStyle. (Таким образом, он идентичен CircleCrossStyle, за исключением названия.) Опять же, только последняя строка сетки является правильной.

Есть мысли?

Richard Deeming

Я изо всех сил пытаюсь воспроизвести эту проблему в Kaxaml[^]. И круг, и путь видны в кнопке с помощью CircleXStyle стиль.

Вы пробовали использовать Родинка[^] чтобы проверить логическое дерево, чтобы увидеть, есть ли там содержимое, но не видно по какой-то причине?

Matt T Heffron

Смотрите мое обновление. Похоже, это может сработать только один раз.

Richard Deeming

Что произойдет, если вы попытаетесь установить ContentTemplate вместо того чтобы Content?

<Setter Property="ContentTemplate">
    <Setter.Value>
        <DataTemplate>
            <Grid>
                ...
            </Grid>
        </DataTemplate>
    </Setter.Value>
</Setter>

Matt T Heffron

Может быть, сеттер каким-то образом пытается кэшировать путь как содержимое и может использовать его только в одном месте?
Есть ли способ использовать свойство шаблона ControlTemplate в каждом стиле для установки содержимого родительского стиля?
Есть ли способ иметь ControlTemplate, который "основан" непосредственно на другом ControlTemplate, чтобы разрешить настройку содержимого для "многократного использования"?

Richard Deeming

Я подозреваю, что именно это и происходит. Как я уже сказал, Попробуйте ContentTemplate вместо.

Matt T Heffron

Вот в чем фокус!
Спасибо!!!

Matt T Heffron

Добавьте его в качестве решения, чтобы я мог "принять" его!
Спасибо снова.

1 Ответов

Рейтинг:
11

Richard Deeming

Как уже упоминалось в комментариях, я подозреваю, что элементы управления, добавленные в Content может использоваться только в одном месте.

Решение состоит в том, чтобы использовать ContentTemplate вместо этого он создает новый экземпляр дочерних элементов управления каждый раз, когда он используется.

<Setter Property="ContentTemplate">
    <Setter.Value>
        <DataTemplate>
            <Grid>
                <Path 

                    Stroke="White"

                    Stretch="Uniform"

                    Margin="0.5"

                    Data="M 1 1 H 0 M 1 1 H 2 M 1 1 V 0 M 1 1 V 2"

                    VerticalAlignment="Stretch"

                    HorizontalAlignment="Stretch" 

                />
            </Grid>
        </DataTemplate>
    </Setter.Value>
</Setter>