Стиль MouseOver на кнопке Silverlight/WPF
Борьба с стилизацией мыши для кнопки... Мне удалось стилизовать кнопку (сплошной красный), но я бы хотел, чтобы она менялась на сплошной черный всякий раз, когда наводилась мышь. Я новичок в XAML, и я вижу, что ему нужен какой-то тип доски/анимации... не уверен, как это сделать.
Любая помощь будет принята с благодарностью.
Ответы
Ответ 1
Это отличается от WPF до Silverlight. В WPF ответ Роб прав.
В Silverlight это не сработает. Silverlight использует VisualStateManager вместо триггеров. Код для этого более сложный, но некоторые люди считают, что это лучше. Вам нужно создать шаблон управления в вашем стиле. (Информацию об определении шаблона управления см. В Эта статья. Самый простой способ создать аналогичный шаблон ControlTemplate - использовать Expression Blend, который имеет чтобы извлечь существующий шаблон полностью для вас.)
В шаблоне управления определите VisualState, о котором вы заботитесь, и о том, что вы хотите.
<VisualStateGroup x:Name="CommonStateGroup">
<VisualState x:Name="MouseOverState">
<Storyboard>
<ColorAnimation Storyboard.TargetName="TopmostElementOfTheTemplate"
Storyboard.TargetProperty="Foreground"
To="Black"
Duration="00:00:00" >
</ColorAnimation>
</Storyboard>
</VisualState>
</VisualStateGroup>
...
Важно также указать цвет переднего плана по умолчанию в этом стиле, как это сделал Роб. Если вы укажете его на элементе управления, он переопределит значения из стиля.
Обратите внимание, что вы можете получить VisualStateManager из WPF Toolkit, чтобы иметь аналогичное решение в WPF.
Ответ 2
В WPF вам не нужна раскадровка, если вы не хотите анимацию:
<Button Content="Hover me">
<Button.Style>
<Style TargetType="Button">
<Setter Property="Background" Value="Red"/>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="Black"/>
</Trigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
Ответ 3
В WPF:
Определите раскадровку в своих ресурсах (любое место, доступное из кнопки или ее стиля):
<Window.Resources>
<Storyboard x:Key="buttonAnim">
<ColorAnimation Storyboard.TargetName="_back" Storyboard.TargetProperty="Color" To="Red" />
</Storyboard>
</Window.Resources>
И в кнопке создайте триггер события, запускающий анимацию:
<Button>
<Button.Background>
<SolidColorBrush Color="Blue" x:Name="_back" />
</Button.Background>
<Button.Triggers>
<EventTrigger RoutedEvent="Button.MouseEnter">
<BeginStoryboard Storyboard="{StaticResource buttonAnim}" />
</EventTrigger>
</Button.Triggers>
Button Text
</Button>
То, что вы хотите оживить, должно явно существовать. Вот почему на фоне явно установлен SolidColorBrush, цвет которого изменяется раскадрой.
Конечно, это должно быть сделано через стиль.
Silverlight поддерживает только событие Loaded на триггерах, поэтому вам нужно прикрепить к нему обработчик реального события и программно запустить программный снимок.
Ответ 4
Yep, Visual State Manager - это ключ здесь. Я просто загрузил бесплатную тему Silverlight в свой блог http://www.blackspike.com/site/silverlight/free-silverlight-4-beta-skin - вы можете помочь себе в стилях, вот xaml для стилизованной кнопки
<SolidColorBrush x:Key="Brush_WindowBackground" Color="#FF333333"/>
<SolidColorBrush x:Key="Brush_Foreground" Color="#FFE5E5E5"/>
<SolidColorBrush x:Key="Brush_Highlight" Color="White"/>
<LinearGradientBrush x:Key="Brush_BackgroundGrad" EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="#FF3F3F3F" Offset="0"/>
<GradientStop Color="#FF353535" Offset="0.3"/>
</LinearGradientBrush>
<LinearGradientBrush x:Key="Brush_BackgroundGrad_Over" EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="#FF474747" Offset="0"/>
<GradientStop Color="#FF2F2F2F" Offset="0.3"/>
</LinearGradientBrush>
<LinearGradientBrush x:Key="Brush_BackgroundGrad_Down" EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="#FF1D1D1D" Offset="0"/>
<GradientStop Color="#FF181818" Offset="0.3"/>
</LinearGradientBrush>
<SolidColorBrush x:Key="Brush_BorderInner" Color="Black"/>
<SolidColorBrush x:Key="Brush_BorderOuter" Color="#FF434343"/>
<Style TargetType="Button">
<Setter Property="Foreground" Value="{StaticResource Brush_Foreground}"/>
<Setter Property="FontFamily" Value="Arial"/>
<Setter Property="FontSize" Value="12"/>
<Setter Property="Padding" Value="15,10"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Grid>
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="CommonStates">
<VisualStateGroup.Transitions>
<VisualTransition GeneratedDuration="0:0:0.2"/>
</VisualStateGroup.Transitions>
<VisualState x:Name="MouseOver">
<Storyboard>
<DoubleAnimation Duration="0" To="1" Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="background_over" d:IsOptimized="True"/>
</Storyboard>
</VisualState>
<VisualState x:Name="Normal"/>
<VisualState x:Name="Pressed">
<Storyboard>
<DoubleAnimation Duration="0" To="1" Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="background_down" d:IsOptimized="True"/>
</Storyboard>
</VisualState>
<VisualState x:Name="Disabled">
<Storyboard>
<DoubleAnimation Duration="0" To="0.2" Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="contentPresenter" d:IsOptimized="True"/>
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<Rectangle x:Name="blackframe" Stroke="{StaticResource Brush_BorderOuter}" Fill="{StaticResource Brush_BorderInner}"/>
<Rectangle x:Name="background" Margin="2" Fill="{StaticResource Brush_BackgroundGrad}"/>
<Rectangle x:Name="background_over" Margin="2" Opacity="0" Fill="{StaticResource Brush_BackgroundGrad_Over}"/>
<Rectangle x:Name="background_down" Margin="2" Opacity="0" Fill="{StaticResource Brush_BackgroundGrad_Down}"/>
<ContentPresenter x:Name="contentPresenter" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="{TemplateBinding Padding}"/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>