Use VisualStates to switch user interface states in this way. Your code will look like this:
public void buttonCase(object sender, RoutedEventArgs e) { if (((App)App.Current).appControler.m_Mode == Controller.textMode.Letters) { ((App)App.Current).appControler.buttonCase(sender, e); switch (((App)App.Current).appControler.m_case) { case Controller.caseMode.Upper: VisualStateManager.GoToState( this, "UpperCase", true ); break; case Controller.caseMode.Lower: VisualStateManager.GoToState( this, "LowerCase", true ); break; } } }
And your xaml will look like this:
<UserControl x:Class="SilverlightApplication2.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:system="clr-namespace:System;assembly=mscorlib"> <UserControl.Resources> <ControlTemplate x:Key="MySpecialToggleButton" TargetType="ToggleButton"> <Grid> <VisualStateManager.VisualStateGroups> <VisualStateGroup x:Name="CheckStates"> <VisualState x:Name="Checked"> <Storyboard> <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Visibility" Storyboard.TargetName="LowerCaseIcon"> <DiscreteObjectKeyFrame KeyTime="0"> <DiscreteObjectKeyFrame.Value> <Visibility>Visible</Visibility> </DiscreteObjectKeyFrame.Value> </DiscreteObjectKeyFrame> </ObjectAnimationUsingKeyFrames> <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Visibility" Storyboard.TargetName="UpperCaseIcon"> <DiscreteObjectKeyFrame KeyTime="0"> <DiscreteObjectKeyFrame.Value> <Visibility>Collapsed</Visibility> </DiscreteObjectKeyFrame.Value> </DiscreteObjectKeyFrame> </ObjectAnimationUsingKeyFrames> </Storyboard> </VisualState> <VisualState x:Name="Unchecked"/> </VisualStateGroup> </VisualStateManager.VisualStateGroups> <Image x:Name="UpperCaseIcon" Source="/SilverlightApplication2;component/Images/Lower_Case_p.png" Visibility="Visible"/> <Image x:Name="LowerCaseIcon" Source="/SilverlightApplication2;component/Images/Case_p.png" Visibility="Collapsed"/> </Grid> </ControlTemplate> </UserControl.Resources> <StackPanel> <VisualStateManager.VisualStateGroups> <VisualStateGroup x:Name="LetterCaseStates"> <VisualState x:Name="UpperCase"/> <VisualState x:Name="LowerCase"> <Storyboard> <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="FontSize" Storyboard.TargetName="bCornerLower"> <DiscreteObjectKeyFrame KeyTime="0"> <DiscreteObjectKeyFrame.Value> <system:Double>40</system:Double> </DiscreteObjectKeyFrame.Value> </DiscreteObjectKeyFrame> </ObjectAnimationUsingKeyFrames> </Storyboard> </VisualState> </VisualStateGroup> </VisualStateManager.VisualStateGroups> <ToggleButton x:Name="btnCase" Click="buttonCase" Template="{StaticResource MySpecialToggleButton}"/> <Button x:Name="bCornerLower" FontSize="30"/> <Button x:Name="b0" FontSize="{Binding ElementName=bCornerLower, Path=FontSize}"/> <Button x:Name="b1" FontSize="{Binding ElementName=bCornerLower, Path=FontSize}"/> <Button x:Name="b2" FontSize="{Binding ElementName=bCornerLower, Path=FontSize}"/> <Button x:Name="b3" FontSize="{Binding ElementName=bCornerLower, Path=FontSize}"/> <Button x:Name="b4" FontSize="{Binding ElementName=bCornerLower, Path=FontSize}"/> <Button x:Name="b5" FontSize="{Binding ElementName=bCornerLower, Path=FontSize}"/> <Button x:Name="b6" FontSize="{Binding ElementName=bCornerLower, Path=FontSize}"/> <Button x:Name="b7" FontSize="{Binding ElementName=bCornerLower, Path=FontSize}"/> <Button x:Name="b8" FontSize="{Binding ElementName=bCornerLower, Path=FontSize}"/> <Button x:Name="b9" FontSize="{Binding ElementName=bCornerLower, Path=FontSize}"/> </StackPanel>
I wrote the code as an answer to a similar question: switch a button with different images
I know that the definition of VisualStates may look rather cumbersome, but in the end you can keep your code behind pretty clean by switching the visual appearance of all the ui bits.
source share