2011-05-26 83 views
0

我想用預定義的VisualState創建一個ControlTemplate。我想用GoToStateActions和DataTriggers來使用它們。帶有VisualStates的WPF ControlTemplate

我不知道這裏究竟出了什麼問題。在我看來,綁定不是以我認爲的方式建立的。

namespace ControlTemplateVisualState 
{ 
    using System.Windows.Controls; 


    public class MyControl : ContentControl 
    { 
     public MyControl() 
     { 
      this.DefaultStyleKey = typeof(MyControl); 
     } 
    } 
} 
<ResourceDictionary 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:ControlTemplateVisualState="clr-namespace:ControlTemplateVisualState" 
    xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" 
    xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"> 

    <ControlTemplate x:Key="MyControlTemplate" TargetType="{x:Type ControlTemplateVisualState:MyControl}"> 
     <Grid x:Name="grid" Background="Red"> 
      <VisualStateManager.VisualStateGroups> 
       <VisualStateGroup x:Name="VisualStateGroup"> 
        <VisualState x:Name="IsDisabledState"> 
         <Storyboard> 
          <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)" Storyboard.TargetName="grid"> 
           <EasingColorKeyFrame KeyTime="0" Value="#FF2BFF00"/> 
          </ColorAnimationUsingKeyFrames> 
         </Storyboard> 
        </VisualState> 
       </VisualStateGroup> 
      </VisualStateManager.VisualStateGroups> 
      <i:Interaction.Triggers> 
       <ei:DataTrigger Binding="{Binding IsEnabled, ElementName=grid}" Value="False"> 
        <ei:GoToStateAction StateName="IsDisabledState"/> 
       </ei:DataTrigger> 
      </i:Interaction.Triggers> 
     </Grid> 
    </ControlTemplate> 

    <Style TargetType="{x:Type ControlTemplateVisualState:MyControl}"> 
     <Setter Property="Background" Value="#FF0010FF"/> 
     <Setter Property="Template" Value="{StaticResource MyControlTemplate}"/> 
    </Style> 
</ResourceDictionary> 


<Window 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    x:Class="ControlTemplateVisualState.MainWindow" 
    x:Name="Window" 
    xmlns:local="clr-namespace:ControlTemplateVisualState" 
    Title="MainWindow" 
    Width="640" Height="480"> 

    <Grid x:Name="LayoutRoot"> 
     <local:MyControl IsEnabled="False"/> 
    </Grid> 
</Window> 

回答

1

你可以給這個一展身手:

<i:Interaction.Behaviors> 
     <si:DataStateBehavior Binding='{Binding IsLoggedIn}' Value='True' 
      TrueState='LoggedInState' FalseState='LoggedOutState'/> 
</i:Interaction.Behaviors> 

這是略有不同,但即使與Silverlight,請參閱:http://expressionblend.codeplex.com/wikipage?title=Behaviors%20and%20Effects&referringTitle=Documentation

只要確保獲得固定版本,如果您使用WPF4:http://expressionblend.codeplex.com/workitem/8148

0

我不認爲混合SDK的觸發和行爲可以控制模板中使用 - 僅在用戶控件:有哪個當XAML解析的觸發器可以不附加任何具體對象。 (我不是100%肯定這個解釋,但我知道如果你有多個控制模板,你不能把Blend行爲放在所有的模板中。)你需要使用代碼來調用VSM--這就是自定義控件的工作方式。你會使用類似這樣的代碼從Silverlight Toolkit

public static void GoToState(Control control, bool useTransitions, params string[] stateNames) 
{ 
    foreach (var name in stateNames) 
    { 
     if (VisualStateManager.GoToState(control, name, useTransitions)) 
      break; 
    } 
} 
+0

感謝您的回答,但是您使用此foreach的意圖是什麼?空中接力?你傳遞多個字符串並在成功時打破循環? – 0xbadf00d 2011-06-03 08:07:20

+0

你知道,我沒有很好的理由。答案是「這是他們如何在Silverlight工具包中完成的」,但我似乎無法找到解釋原因的解釋。源代碼在這裏:http://silverlight.codeplex.com/SourceControl/changeset/view/61620#779580 – 2011-06-06 16:40:56