2012-06-22 2 views

ответ

2

Итак, вот моя попытка:

<VisualStateManager.VisualStateGroups> 
    <VisualStateGroup x:Name="VisualStateGroup"> 
     <VisualState x:Name="Normal"/> 
     <VisualState x:Name="Hover"> 
      <Storyboard> 
       <ColorAnimation To="Yellow" Duration="0" 
        Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)" 
        Storyboard.TargetName="MyTextBox" /> 
      </Storyboard> 
     </VisualState> 
    </VisualStateGroup> 
</VisualStateManager.VisualStateGroups> 

<Grid x:Name="MyTextBox" Background="White" 
     PointerEntered="MyTextBox_PointerEntered" 
     PointerExited="MyTextBox_PointerExited" 
     Height="114" Width="537"> 
</Grid> 

И это:

private void MyTextBox_PointerEntered(object sender, PointerRoutedEventArgs e) 
{ 
    VisualStateManager.GoToState(this, Hover.Name, false); 
} 

private void MyTextBox_PointerExited(object sender, PointerRoutedEventArgs e) 
{ 
    VisualStateManager.GoToState(this, Normal.Name, false); 
} 

Но, конечно, есть лучший способ!

+0

Пройдитесь по этому вопросу, исследуя ситуацию наведения на scrollviewer. Интересное решение. :-) – OmegaMan

0

Я думаю, что вам нужно изучить Визуальные состояния и VisualStateManager. Я думаю, что элемент управления Button является единственным, у которого есть визуальные состояния, то есть ваш визуальный объект должен быть определен как кнопка (хотя он не должен функционировать как один). В нижней части этой статьи вы найдете пример.

This SO-question также может быть полезным, описывая, как извлечь шаблон управления из существующей кнопки. Это даст вам отправную точку, которую вы можете изменить для своих нужд.

Что касается «большинства конденсированных решений», я бы тоже хотел это увидеть. Примеры, которые я видел, все они требуют 20+ строк XAML кода, который мне не чувствует себя очень конденсироваться ...

+1

Нет, я не думаю, что Button является единственным элементом управления с VisualStates. Если вы подтягиваете шаблон Grid, они используют VisualStateManager на главной сетке для управления переходом между FullScreenLandscape, Snapped, Portrait и т. Д. –

2
<VisualStateManager.VisualStateGroups> 
      <VisualStateGroup x:Name="CommonStates"> 
       <VisualState x:Name="Normal"/> 
       <VisualState x:Name="PointerOver"> 
        <Storyboard> 
         <ColorAnimation To="Yellow" Duration="0" 
       Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)" 
       Storyboard.TargetName="MyTextBox" /> 
        </Storyboard> 
       </VisualState> 
       <VisualState x:Name="Pressed"/> 
      </VisualStateGroup> 
</VisualStateManager.VisualStateGroups> 

Состояние «Наведение» в RT - «PointerOver».