具有VisualStates的WPF ControlTemplate

| 我想用预定义的VisualStates创建一个ControlTemplate。我想将它们与GoToStateActions和DataTriggers一起使用。 我不知道这里到底出了什么问题。在我看来,绑定不是按照我认为的那样建立的。
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>
    
已邀请:

bab

您可以尝试一下:
<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     
我不认为Blend SDK触发器和行为可以在控件模板中使用-只能在UserControls中使用:解析XAML时,没有可以将触发器附加到的具体对象。 (我不是100%会确定此解释,但我确实知道,如果您有多个控制模板,则不能将Blend行为全部包含在其中。)您将需要代码来调用VSM。 -这就是自定义控件的工作方式。您将使用Silverlight工具包中的以下代码:
public static void GoToState(Control control, bool useTransitions, params string[] stateNames)
{
    foreach (var name in stateNames)
    {
        if (VisualStateManager.GoToState(control, name, useTransitions))
            break;
    }
}
    

要回复问题请先登录注册