2014-09-24 2 views
2

Я использую ControlTemplate для создания разных стилей для кнопки. Он, конечно, нацелен на кнопку типа. Я могу изменить цвета кнопки для разных VisualStates, но все они жестко напечатаны или они относятся к статическому ресурсу.Изменение значения в VisualState

Пример:

<VisualState x:Name="Pressed"> 
    <Storyboard> 
     <ObjectAnimationUsingKeyFrames Storyboard.TargetName="ContentPresenter" 
      Storyboard.TargetProperty="Foreground"> 
      <DiscreteObjectKeyFrame KeyTime="0" Value="Blue" /> 
     </ObjectAnimationUsingKeyFrames> 
    </Storyboard> 
</VisualState> 

На странице я разместил кнопку:

<Button Template="{StaticResource ResourceKey=ButtonDefaultStyle}" 
     Background="Yellow" 
     Content="Hello" /> 

Кнопка является желтым и при нажатии, он станет синим.

Теперь вопрос, как изменить цвет VisualState :: Pressed? Для меня это громоздко создать ControlTemplate для каждой цветной кнопки.

Я использую Visual Studio 2013 Express Update 3. Это для Windows 8.1 и Windows Phone 8.1 с использованием Universal SDK.

ответ

0

Это очень хороший вопрос. Я бы попытался определить свойство прикрепленной кисти и использовать {TemplateBinding (myNamespace:PropertyClass.BrushPropertyName)}, но я не уверен, что это сработает. Было бы полезно использовать VisualTreeHelper, чтобы найти VisualStateManager.VisualStateGroups в шаблоне кнопки (после его загрузки), найти группу и состояние по именам, получить раскадровку/анимацию/ключевое слово по индексу (так как вы не можете прочитать, что такое Storyboard цели) и установите Value. Это немного взломанно, но кто знает - может быть, это будет быстрее, чем разбор еще одного шаблона управления ... Еще один вариант - попробовать поиграть с CustomVisualStateManager.

1

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

словарь

Ресурс выглядит следующим образом для кнопки:

<VisualState x:Name="Pressed"> 
    <Storyboard> 
     <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Background" Storyboard.TargetName="Border"> 
      <DiscreteObjectKeyFrame KeyTime="0" Value="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, Path=PressedColor}"/> 
     </ObjectAnimationUsingKeyFrames>    
    </Storyboard> 
</VisualState> 

Кнопка на странице сама выглядеть следующим образом:

<cc:ButtonStandard Style="{StaticResource ButtonStandardStyle}" 
        Content="Hello Visual Studio" 
        Background="Red" 
        PointerOverColor="Blue" 
        PressedColor="Orange" 
        DisabledColor="White"/> 

PressedColor является Dependency Property внутри ButtonStandard класса пользовательского элемента управления. Это работает, но я не знаю, подходит ли это лучший подход.

Смежные вопросы