в java все переменные, такие как byte short int long float double, записываются как подписанные. так что очень просто, бит главы всегда указывает, что (отрицательное или положительное), а потому, что числа делятся на 2 половины сдвинуты как отрицательные, 0 по умолчанию положительно. поэтому это выглядит так:
это положительно + | 0001001 1 | 0001001 это отрицательно - | 0001001 0 | 0001001 в качестве короткого байта отрицательный -000000011111111 0000000011111111
Это отличается от 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.
В 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>
Да, диспетчер визуального состояния здесь является ключевым. Я только что загрузил бесплатную тему 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>
В 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 для триггеров, поэтому вам нужно прикрепить реальный обработчик событий к кнопке и запустить раскадровку программно.