Silverlight - как повлиять на свойство из VisualState - PullRequest
0 голосов
/ 16 августа 2011

У меня есть следующий код:

<Style x:Key="GoButton" TargetType="Button">
    <Setter Property="Background" Value="#FF2B832C"/>
    <Setter Property="Foreground" Value="#FFfdf7bd"/>
    <Setter Property="FontSize" Value="30" />
    <Setter Property="Padding" Value="3"/>
    <Setter Property="BorderThickness" Value="3"/>
    <Setter Property="BorderBrush">
        <Setter.Value>
            <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
                <GradientStop Color="#4d9e41" Offset="0" />
                <GradientStop Color="#294c22" Offset="1" />
            </LinearGradientBrush>
        </Setter.Value>
    </Setter>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Button">
                <Grid>
                    <VisualStateManager.VisualStateGroups>
                        <VisualStateGroup x:Name="CommonStates">
                            <VisualState x:Name="Normal">
                            </VisualState>
                            <VisualState x:Name="MouseOver">
                                <Storyboard>
                                    <DoubleAnimation Duration="0:0:1" Storyboard.TargetProperty="FontSize" To="35" />
                                </Storyboard>
                            </VisualState>
                        </VisualStateGroup>
                        <VisualStateGroup x:Name="FocusStates">
                            <VisualState x:Name="Focused">
                                <Storyboard>
                                    <DoubleAnimation Duration="0" To="1" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="FocusVisualElement"/>
                                </Storyboard>
                            </VisualState>
                            <VisualState x:Name="Unfocused"/>
                        </VisualStateGroup>
                    </VisualStateManager.VisualStateGroups>
                    <Border x:Name="Background" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="Transparent" CornerRadius="5">
                        <Grid Background="{TemplateBinding Background}" Margin="0">
                            <Border x:Name="BackgroundAnimation" Background="#FF448DCA" CornerRadius="5" Opacity="0"/>
                            <Rectangle x:Name="BackgroundGradient" RadiusX="5" RadiusY="5">
                                <Rectangle.Fill>
                                    <LinearGradientBrush EndPoint="0.8,1" StartPoint="0,0">
                                        <GradientStop Color="#66b04d" Offset="0"/>
                                        <GradientStop Color="#66b04d" Offset="0.375"/>
                                        <GradientStop Color="#2d822d" Offset="0.625"/>
                                        <GradientStop Color="#2d822d" Offset="1"/>
                                    </LinearGradientBrush>
                                </Rectangle.Fill>
                            </Rectangle>
                        </Grid>
                    </Border>
                    <ContentPresenter x:Name="contentPresenter" ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                    <Rectangle x:Name="DisabledVisualElement" Fill="#FFFFFFFF" IsHitTestVisible="false" Opacity="0" RadiusY="6" RadiusX="6"/>
                    <Rectangle x:Name="FocusVisualElement" IsHitTestVisible="false" Margin="1" Opacity="0" RadiusY="5" RadiusX="5" Stroke="#FF6DBDD1" StrokeThickness="1"/>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

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

<DoubleAnimation Duration="0:0:1" Storyboard.TargetProperty="FontSize" To="35" />

как это правильно сделать?

1 Ответ

3 голосов
/ 16 августа 2011

Я заставил вашу анимацию работать, заменив <ContentPresenter> в вашем шаблоне на

<ContentControl x:Name="nestedContentControl" ContentTemplate="{TemplateBinding ContentTemplate}" 
                Content="{TemplateBinding Content}" Foreground="{TemplateBinding Foreground}"
                HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                Margin="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" />

и затем установив Storyboard.TargetName вашей анимации MouseOver на nestedContentControl.

.Кажется, проблема заключается в предоставлении значения для Storyboard.TargetName.Хотя вы можете получить доступ к имени элемента управления, к которому применяется шаблон (то есть к кнопке, использующей этот шаблон), раскадровка не может получить доступ к шаблонному элементу управления.Поэтому вместо этого мы вкладываем в шаблон другой ContentControl (Button сам по себе является ContentControl) и используем его.

Однако использование другого ContentControl имеет свои недостатки.Мне пришлось добавить свойство Foreground="{TemplateBinding Foreground}", чтобы он мог подобрать цвет переднего плана, который вы использовали.Вполне возможно, что вам может понадобиться добавить дополнительные «сквозные» привязки в зависимости от того, какие другие свойства вам нужно использовать.

Имейте в виду, что на вашем Focused VisualState также есть анимация.Эта анимация не будет работать так, как она есть, потому что вы не указали TargetName для нее.Я не знаю, что предложить для этого, потому что я не уверен, что вы пытаетесь достичь.

Наконец, отвечая на этот вопрос, я также нашел аналогичный вопрос оанимация свойства объекта шаблонного родителя.В этом случае решение, по-видимому, состоит в том, чтобы подключить анимацию в коде позади.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...