一次性设置多个视觉状态?

时间:2011-05-30 01:12:57

标签: c# silverlight visualstatemanager visualstates

我定义了四种视觉状态,每种状态都影响同一银光控制中的不同子控件。 我是否可以创建其他视觉状态来调用其他视觉状态?

  

所以如果我有 Visual_Group_1,Visual_Group_2,Visual_Group_3,Visual_Group_4

  1. 是否可以制作,比如说 Visual_Comb_1使用的组 Visual_Group_1和。中的状态 Visual_Group_3?
  2. 然后创建另一个名为Visual_Comb_2的使用Visual_Group_4和Visual_Group_3?
  3. 我很高兴实施solution in xaml or codebehind or a combination of both。 我目前正在寻找的替代方案涉及大量代码复制+粘贴,我不太热衷于这样做。

    每个请求的更多细节:

    这就是我现在大致拥有的:

    <VisualState x:Name="State1">
        <ColorAnimation Storyboard.TargetName="Path1"
                        Storyboard.TargetProperty="(Path.Fill).(SolidColorBrush.Color)"
                        To="Blue" Duration="0:0:0.5" />
        // fade out the rest of the paths...
        <ColorAnimation Storyboard.TargetName="Path2"
                        Storyboard.TargetProperty="(Path.Fill).(SolidColorBrush.Color)"
                        To="#00000000" Duration="0:0:0.5" />
        <ColorAnimation Storyboard.TargetName="Path3"
                        Storyboard.TargetProperty="(Path.Fill).(SolidColorBrush.Color)"
                        To="#00000000" Duration="0:0:0.5" />
        <ColorAnimation Storyboard.TargetName="Path4"
                        Storyboard.TargetProperty="(Path.Fill).(SolidColorBrush.Color)"
                        To="#00000000" Duration="0:0:0.5" />
    </VisualState>
    
    <VisualState x:Name="State2">
        <ColorAnimation Storyboard.TargetName="Path3"
                        Storyboard.TargetProperty="(Path.Fill).(SolidColorBrush.Color)"
                        To="Red" Duration="0:0:0.5" />
        // fade out the rest of the paths...
        <ColorAnimation Storyboard.TargetName="Path2"
                        Storyboard.TargetProperty="(Path.Fill).(SolidColorBrush.Color)"
                        To="#00000000" Duration="0:0:0.5" />
        <ColorAnimation Storyboard.TargetName="Path1"
                        Storyboard.TargetProperty="(Path.Fill).(SolidColorBrush.Color)"
                        To="#00000000" Duration="0:0:0.5" />
        <ColorAnimation Storyboard.TargetName="Path4"
                        Storyboard.TargetProperty="(Path.Fill).(SolidColorBrush.Color)"
                        To="#00000000" Duration="0:0:0.5" />
    </VisualState>
    
    <VisualState x:Name="State3">
        <ColorAnimation Storyboard.TargetName="Path4"
                        Storyboard.TargetProperty="(Path.Fill).(SolidColorBrush.Color)"
                        To="Pink" Duration="0:0:0.5" />
        // fade out the rest of the paths...
        <ColorAnimation Storyboard.TargetName="Path2"
                        Storyboard.TargetProperty="(Path.Fill).(SolidColorBrush.Color)"
                        To="#00000000" Duration="0:0:0.5" />
        <ColorAnimation Storyboard.TargetName="Path1"
                        Storyboard.TargetProperty="(Path.Fill).(SolidColorBrush.Color)"
                        To="#00000000" Duration="0:0:0.5" />
        <ColorAnimation Storyboard.TargetName="Path3"
                        Storyboard.TargetProperty="(Path.Fill).(SolidColorBrush.Color)"
                        To="#00000000" Duration="0:0:0.5" />
    </VisualState>
    

    我的目标是有一个控件,当你点击从state1到state3的循环时,每个状态在淡出其他路径时淡入不同的路径。我的问题是'淡出其余路径'部分有一吨拷贝+粘贴,所以如果我想添加一个Path5,那就意味着将它添加到已定义的每个视觉状态,或者我想要要改变渐弱颜色或动画,我必须对每个视觉状态都这样做。

1 个答案:

答案 0 :(得分:4)

感谢您提供XAML。这就是我解决这个问题的方法。

首先,为每个VisualStates单独创建Path。 (我建议使用Style来保存您将非常相似的VisualState重新编码到每个路径中,但我不熟悉它们以了解您是否可以为每个路径应用不同的颜色。 )

<VisualStateManager.VisualStateGroups>
    <VisualStateGroup x:Name="Path1States">
        <VisualState x:Name="Activate">
            <Storyboard>
                <ColorAnimation Storyboard.TargetName="Path1"
                                Storyboard.TargetProperty="(Path.Fill).(SolidColorBrush.Color)"
                                To="Blue"
                                Duration="0:0:0.5" />
            </Storyboard>
        </VisualState>
        <VisualState x:Name="Deactivate">
            <Storyboard>
                <ColorAnimation Storyboard.TargetName="Path1"
                                Storyboard.TargetProperty="(Path.Fill).(SolidColorBrush.Color)"
                                To="#00000000"
                                Duration="0:0:0.5" />
            </Storyboard>
        </VisualState>
    </VisualStateGroup>
    <VisualStateGroup x:Name="Path2States">
        <!-- ... etc ... -->
    </VisualStateGroup>
</VisualStateManager.VisualStateGroups>

现在,在包含每个相关对象的代码隐藏中创建一个List,然后右键单击您自己的GoToState函数,使其为一个对象打开in状态,并调用休息的状态。

List<Path> pathList;

public Page() // constructor
{
    InitializeComponent();
    pathList = new List<Path>();
    pathList.Add(Path1);
    // and so forth
}

// Call this function when you want to change the state
private void ActivatePath(Path p)
{
    foreach (Path listItem in pathList)
    {
        // If the item from the list is the one you want to activate...
        if (listItem == p)
            VisualStateManager.GoToState(listItem, "Activate", true);
        // otherwise...
        else
            VisualStateManager.GoToState(listItem, "Deactivate", true);
    }
}

如果我在XAML和样式方面做得更好,我可能会更清晰地创建VisualStates。但是,我的强项更多的是逻辑和编码方面。话虽这么说,写出相同的VisualState四五次就更清晰了! :)
希望这有帮助!