Повторное использование стиля / элемента управления WPF

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

<Button Cursor="Hand" HorizontalAlignment="Left" Margin="0,0,0,0" x:Name="MyButton" Style="{StaticResource ButtonTemplate}" Width="286" Content="hi!" Focusable="False" IsTabStop="False"/>
<Button Cursor="Hand" HorizontalAlignment="Left" Margin="0,0,0,0" x:Name="MyButton2" Style="{StaticResource ButtonTemplate}" Width="286" Content="hi 2!" Focusable="False" IsTabStop="False"/>

Я бы очень хотел использовать что-то вроде этого шаблона:

<Style TargetType="{x:Type Button}" x:Key="ButtonTemplate">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type Button}">
                        <Grid x:Name="btGrid">
                            <Path Cursor="Hand" HorizontalAlignment="Left" Stretch="Fill" Stroke="{x:Null}" Opacity="0" x:Name="path"/>
                            <ContentPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" RecognizesAccessKey="True" Visibility="Hidden" HorizontalAlignment="Left" Margin="0,0,0,0" VerticalAlignment="Top"/>
                        </Grid>
                        <ControlTemplate.Triggers>
                            <EventTrigger RoutedEvent="Button.PreviewMouseLeftButtonDown">
                                <EventTrigger.Actions>
                                    <BeginStoryboard>
                                        <Storyboard SlipBehavior="Slip" BeginTime="00:00:00">
                                            <MediaTimeline Source="{Binding StringFormat={}, Path=Name}" Storyboard.TargetName="{Binding StringFormat={}_wma, Path=Name}"/>
                                                    <ObjectAnimationUsingKeyFrames    Storyboard.TargetName="{Binding StringFormat=key{}, Path=Name}" Storyboard.TargetProperty="Visibility">
            <DiscreteObjectKeyFrame KeyTime="0">
                <DiscreteObjectKeyFrame.Value>
                    <Visibility>
                        Visible
                    </Visibility>
                </DiscreteObjectKeyFrame.Value>
            </DiscreteObjectKeyFrame>
        </ObjectAnimationUsingKeyFrames>
                                        </Storyboard>
                                    </BeginStoryboard>
                                </EventTrigger.Actions>
                            </EventTrigger>
                            <EventTrigger RoutedEvent="Button.PreviewMouseLeftButtonUp">
                                <EventTrigger.Actions>
                                    <BeginStoryboard>
                                        <Storyboard>
                                            <ObjectAnimationUsingKeyFrames Storyboard.TargetName="{Binding StringFormat=key{}, Path=Name}" Storyboard.TargetProperty="Visibility">
            <DiscreteObjectKeyFrame KeyTime="0">
                <DiscreteObjectKeyFrame.Value>
                    <Visibility>
                        Hidden
                    </Visibility>
                </DiscreteObjectKeyFrame.Value>
            </DiscreteObjectKeyFrame>
        </ObjectAnimationUsingKeyFrames>
                                        </Storyboard>
                                    </BeginStoryboard>
                                </EventTrigger.Actions>
                            </EventTrigger>
                            <Trigger Property="IsFocused" Value="True"/>
                            <Trigger Property="IsDefaulted" Value="True"/>
                            <Trigger Property="IsMouseOver" Value="True"/>
                            <Trigger Property="IsPressed" Value="True"/>
                            <Trigger Property="IsEnabled" Value="False"/>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>

И я бы хотел, чтобы {Binding StringFormat = {}, Path = Name} указывал на название кнопки, например «MyButton», «MyButton2» и т. Д.

Когда я запускаю этот код, я получаю сообщение об ошибке «Невозможно заморозить это дерево временной шкалы раскадровки для использования между потоками». : / Я так понимаю, это потому, что я использую привязку в раскадровке, верно? Я не знаю, что делать, чтобы все заработало.

Кроме того, я хотел бы сделать ToggleVisibility изображения шаблоном, который принимает один раз значения «Visible» и один раз «Hidden». Заранее спасибо!


person Rita    schedule 19.06.2010    source источник


Ответы (2)


Вы всегда можете определить свойства, отличные от Template, в своем стиле.

    <Style TargetType="{x:Type Button}"
           x:Key="ButtonTemplate">
        <Setter Property="Cursor" Value="Hand" />
        <Setter Property="HorizontalAlignment" Value="Left" />
        <Setter Property="Margin" Value="0,0,0,0" />
        <Setter Property="Width" Value="286" />
        <Setter Property="Focusable" Value="False" />
        <Setter Property="IsTabStop" Value="False" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Button}">
                    ...
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

Что делает ваш код похожим на

    <Button x:Name="MyButton" Style="{StaticResource ButtonTemplate}" Content="hi!" />
    <Button x:Name="MyButton2" Style="{StaticResource ButtonTemplate}" Content="hi 2!" />
person decyclone    schedule 19.06.2010
comment
Привет, спасибо за ответ, но это не работает ... Я все еще получаю то же исключение {Невозможно заморозить это дерево временной шкалы раскадровки для использования в потоках.}. - person Rita; 22.06.2010
comment
Хорошо, что вы имеете в виду под этой строкой: ‹MediaTimeline Source = {Binding StringFormat = {}, Path = Name} Storyboard.TargetName = {Binding StringFormat = {} _ wma, Path = Name} /› - person decyclone; 23.06.2010

Да, создание стиля с целевым типом кнопки как кнопка сделает свое дело.

Tip: Всегда рекомендуется записывать всю информацию о стилях, такую ​​как граница, фон, шаблоны и т. Д., В разделе ресурсов вашего кода и применять их к элементам управления. Это даст хорошую читаемость.

HTH :)

person Prince Ashitaka    schedule 21.06.2010