WMP ControlTemplate Trigger - an Bedingungen knüpfen



  • Hallo zusammen ...

    Eine vom Expander abgeleitete Klasse mit dem Namen myExpander habe ich um einige Propertys erweitert. Eine dieser Propertys ist die AutoModeProperty welche per Codebehind manipuliert wird.

    Ein erstellter Style erlaubt die Animation des ein- bzw. ausblendens.

    <ControlTemplate.Triggers> 
    							<Trigger Property="IsExpanded" Value="true"> 
    		                        <Trigger.EnterActions> 
    		                            <BeginStoryboard> 
    		                                <Storyboard> 
    		                                    <DoubleAnimation Storyboard.TargetName ="ExpandSiteContainer"  
    		                                      Storyboard.TargetProperty ="Tag" 
    		                                      To="1.0" Duration ="0:0:0.25" /> 
    		                                </Storyboard> 
    		                            </BeginStoryboard> 
    		                        </Trigger.EnterActions> 
    		                        <Trigger.ExitActions> 
    		                            <BeginStoryboard> 
    		                                <Storyboard> 
    		                                    <DoubleAnimation Storyboard.TargetName ="ExpandSiteContainer"  
    		                                        Storyboard.TargetProperty ="Tag" 
    		                                        To="0" Duration ="0:0:0.25"/> 
    		                                </Storyboard> 
    		                            </BeginStoryboard> 
    		                        </Trigger.ExitActions> 
                        		</Trigger>
    

    Der ExpanderDownHeaderStyle als Part des StandardExpanders sieht so aus:

    Style x:Key="ExpanderDownHeaderStyle" TargetType="{x:Type ToggleButton}">
    			<Setter Property="Template">
    				<Setter.Value>
    					<ControlTemplate TargetType="{x:Type ToggleButton}">						
    						<Border x:Name="border" Padding="{TemplateBinding Padding}" BorderBrush="{Binding myTitleBorderBrush, RelativeSource={RelativeSource AncestorType={x:Type local:myExpander}, Mode=FindAncestor}}" CornerRadius="{Binding myTitleBorderCorner, RelativeSource={RelativeSource AncestorType={x:Type local:myExpander}, Mode=FindAncestor}}" Margin="{Binding myTitleBorderMargin, RelativeSource={RelativeSource AncestorType={x:Type local:myExpander}, Mode=FindAncestor}}" BorderThickness="{Binding myTitleBorderThickness, RelativeSource={RelativeSource AncestorType={x:Type local:myExpander}, Mode=FindAncestor}}" Background="{Binding myTitleBrush, RelativeSource={RelativeSource AncestorType={x:Type local:myExpander}, Mode=FindAncestor}}"  >														
    							<i:Interaction.Triggers>
    								<i:EventTrigger EventName="PreviewMouseLeftButtonDown">									
    									<ei:PlaySoundAction Source="../Sounds/smartClick.mp3"/>
    									<ei:CallMethodAction TargetObject="{Binding RelativeSource={RelativeSource AncestorType={x:Type local:myExpander}, Mode=FindAncestor}}"   MethodName="OnMouseLeftButtonDown"/>									
    								</i:EventTrigger>	
    							</i:Interaction.Triggers>
    

    Erreichen möchte ich folgendes:

    - AutoMode == true --> Animation des ein- bzw ausblendens bei MouseEnter und MouseLeave, klappt soweit
    - AutoMode == true && MouseLeftButtonDown --> AutoMode = false, also gepinnt, keine weitere Aktion
    - AutoMode == false && MouseLeftButtonDown --> AutoMode = true, nicht gepinnt, keine weitere Aktion bis auf MouseEnter & MouseLeave

    Hierzu hatte ich die CallMethodAction im "ExpanderDownHeaderStyle" vorgesehen:

    private void OnMouseLeftButtonDown(object sender, System.Windows.Input.MouseEventArgs e)
            {
                //Deaktiviert Automatisches Ein / Ausblenden 
    
                if (AutoMode)
                {                               
                    SetCurrentValue(IsExpandedProperty, !this.IsExpanded);
                    AutoMode = !AutoMode; 
    
                    AnimateTimer.Stop();
                    return;
                }
    
                else
                {
                    AutoMode = true;
                    return;
                }
            }
    

    Nun ist es so, dass der Expander natürlich bei einem "Click" sofort die IsExpanded Property negiert, welches dieser Code rückgängig machen soll:

    SetCurrentValue(IsExpandedProperty, !this.IsExpanded);
    

    Allerdings habe ich dann den unschönen Effekt, dass die Animation bereits gestartet ist, so dass ich ein "auf und zu" - gehen zu sehen bekomme.

    Alles in allem - wie würdet ihr das Lösen ?


Anmelden zum Antworten