none
Странное поведение WPF Style и Template

    Вопрос

  • Здравствуйте.

    Хочу создать базовый стиль кнопки (бордер, закругления, триггеры и т.д.), а от него наследоваться и заменять Content

    Базовый стиль:

     <Style x:Key="BaseButtonStyle" TargetType="Button">
                
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="Button">
    
                            <Border
                                CornerRadius="3"
                                BorderBrush="#707070"
                                BorderThickness="1"
                                Background="#F0F0F0">
                                
                                <ContentPresenter/>
    
                            </Border>
    
                            <ControlTemplate.Triggers>
                                <Trigger Property="IsMouseOver" Value="True">
                                    <Setter Property="Opacity" Value="0.5"/>
                                </Trigger>
    
                                <Trigger Property="Button.IsPressed"  Value="true">
                                    <Setter Property="RenderTransformOrigin" Value="0.5 0.5"/>
                                    <Setter Property="RenderTransform">
                                        <Setter.Value>
                                            <ScaleTransform ScaleX="0.9" ScaleY="0.9"/>
                                        </Setter.Value>
                                    </Setter>
                                </Trigger>
                            </ControlTemplate.Triggers>
    
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
                
            </Style>

    Стиль наследник:

    <Style x:Key="CrossButton" TargetType="Button" BasedOn="{StaticResource BaseButtonStyle}">
                
                <Setter Property="Content">
                    <Setter.Value>
                        <Path
                            Margin="3"                                    
                            Stroke="Black"
                            StrokeThickness="2"
                            StrokeStartLineCap="Square"
                            StrokeEndLineCap="Square"
                            Stretch="Uniform"
                            VerticalAlignment="Center"
                            HorizontalAlignment="Center">
                            <Path.Data>
                                <PathGeometry>
                                    <PathGeometry.Figures>
                                        <PathFigure StartPoint="0,0">
                                            <LineSegment Point="10,10"/>
                                        </PathFigure>
                                        <PathFigure StartPoint="0,10">
                                            <LineSegment Point="10,0"/>
                                        </PathFigure>
                                    </PathGeometry.Figures>
                                </PathGeometry>
                            </Path.Data>
                        </Path>
                    </Setter.Value>
                </Setter>
                
            </Style>

    помимо кнопки-крестика еще будут кнопки - стрелки.

    Но вот поведение ItemsControl меня немного удивило:


    Код ItemsControl:

     <ItemsControl
                ItemsSource="{Binding List}">
                
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <Border>
                            <StackPanel Orientation="Horizontal">
                                
                                <TextBlock Text="{Binding Order}" Margin="5"/>
                                
                                <TextBlock Text="{Binding Name}" Margin="5"/>
    
                                <Button Style="{StaticResource CrossButton}" Margin="5"/>
    
                            </StackPanel>
                        </Border>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
                
            </ItemsControl>

    Базовый стиль присутствует во всех кнопках, не понятно почему только последний элемент получил стиль контента.

    Помогите пожалуйста разобраться.

    Спасибо!


    • Изменено Alexey110 9 октября 2017 г. 14:34
    6 октября 2017 г. 7:57

Ответы

  • Вот так поправьте:

    <Style x:Key="CrossButton" TargetType="Button" BasedOn="{StaticResource BaseButtonStyle}">
        <Setter Property="ContentTemplate">
            <Setter.Value>
                <DataTemplate>
                    <Path
                    Margin="3"                                    
                    Stroke="Black"
                    StrokeThickness="2"
                    StrokeStartLineCap="Square"
                    StrokeEndLineCap="Square"
                    Stretch="Uniform"
                    VerticalAlignment="Center"
                    HorizontalAlignment="Center">
                        <Path.Data>
                            <PathGeometry>
                                <PathGeometry.Figures>
                                    <PathFigure StartPoint="0,0">
                                        <LineSegment Point="10,10"/>
                                    </PathFigure>
                                    <PathFigure StartPoint="0,10">
                                        <LineSegment Point="10,0"/>
                                    </PathFigure>
                                </PathGeometry.Figures>
                            </PathGeometry>
                        </Path.Data>
                    </Path>
                </DataTemplate>
            </Setter.Value>
        </Setter>
    
    </Style>

    Все становиться нормально:

    12 октября 2017 г. 12:52
    Отвечающий

Все ответы

  • А ваших стилях заданы MinHeight и MinWidth?

    Есть подозрения, что ItemsControl не позволяет нормально определить размеры для контента.

    Да и задание этих свойств в стиле в большинстве случаев является нужным действием. Я бы сказал - хорошим тоном создания шаблонов.


    VB.Net - WPF, UWP

    7 октября 2017 г. 10:14
    Отвечающий
  • К сожалению не помогло.

    Устанавливал MinHeight и MinWidth и ContentPresenter и Border и не помогло.

    9 октября 2017 г. 14:33
  • Вот так поправьте:

    <Style x:Key="CrossButton" TargetType="Button" BasedOn="{StaticResource BaseButtonStyle}">
        <Setter Property="ContentTemplate">
            <Setter.Value>
                <DataTemplate>
                    <Path
                    Margin="3"                                    
                    Stroke="Black"
                    StrokeThickness="2"
                    StrokeStartLineCap="Square"
                    StrokeEndLineCap="Square"
                    Stretch="Uniform"
                    VerticalAlignment="Center"
                    HorizontalAlignment="Center">
                        <Path.Data>
                            <PathGeometry>
                                <PathGeometry.Figures>
                                    <PathFigure StartPoint="0,0">
                                        <LineSegment Point="10,10"/>
                                    </PathFigure>
                                    <PathFigure StartPoint="0,10">
                                        <LineSegment Point="10,0"/>
                                    </PathFigure>
                                </PathGeometry.Figures>
                            </PathGeometry>
                        </Path.Data>
                    </Path>
                </DataTemplate>
            </Setter.Value>
        </Setter>
    
    </Style>

    Все становиться нормально:

    12 октября 2017 г. 12:52
    Отвечающий
  • Спасибо большое.

    Помогло!!!

    16 октября 2017 г. 7:12
  • Пожалуйста :)
    16 октября 2017 г. 7:13
    Отвечающий