Как бы стиль сохранить свойства содержимого набор в стиле по?
Я пытаюсь определить иерархию стилей кнопок и хотел бы иметь возможность устанавливать значения свойств в производном стиле без потери значения содержимого, установленного в родитель Стиль.
Что я уже пробовал:
Вот упрощенный" корневой " стиль:
<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
Добавьте его в качестве решения, чтобы я мог "принять" его!
Спасибо снова.