Стиль MouseOver на кнопке Silverlight / WPF

в java все переменные, такие как byte short int long float double, записываются как подписанные. так что очень просто, бит главы всегда указывает, что (отрицательное или положительное), а потому, что числа делятся на 2 половины сдвинуты как отрицательные, 0 по умолчанию положительно. поэтому это выглядит так:

это положительно + | 0001001 1 | 0001001 это отрицательно - | 0001001 0 | 0001001 в качестве короткого байта отрицательный -000000011111111 0000000011111111

13
задан mattruma 8 March 2010 в 13:20
поделиться

4 ответа

Это отличается от 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.

17
ответ дан 1 December 2019 в 18:13
поделиться

В 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>
13
ответ дан 1 December 2019 в 18:13
поделиться

Да, диспетчер визуального состояния здесь является ключевым. Я только что загрузил бесплатную тему 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>
5
ответ дан 1 December 2019 в 18:13
поделиться

В 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 для триггеров, поэтому вам нужно прикрепить реальный обработчик событий к кнопке и запустить раскадровку программно.

7
ответ дан 1 December 2019 в 18:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: