如何在METRO应用程序中使用GoToState和DataTemplate

时间:2012-05-09 11:34:08

标签: c# xaml visualstatemanager

在我的Page.Resources中,我有DataTamplate:

<DataTemplate x:Key="gridviewQuestStyle">
        <Button Content="{Binding QuestNumb}" Style="{StaticResource buttonQuestStyle}"> 
            <VisualStateManager.VisualStateGroups>
                <VisualStateGroup x:Name="questionStates">                        
                    <VisualState x:Name="Right">
                        <Storyboard>
                            <ColorAnimation Storyboard.TargetName="BackgroundBrush" Storyboard.TargetProperty="Color" To="LightGreen" />
                        </Storyboard>
                    </VisualState>
                    <VisualState x:Name="Wrong">
                        <Storyboard>
                            <ColorAnimation Storyboard.TargetName="BackgroundBrush" Storyboard.TargetProperty="Color" To="Red" />
                        </Storyboard>
                    </VisualState>
                </VisualStateGroup>
            </VisualStateManager.VisualStateGroups>

            <Button.Background>
                <SolidColorBrush x:Name="BackgroundBrush" Color="Black"/>
            </Button.Background>
        </Button>
    </DataTemplate>

然后我创建了GridView:

<GridView Grid.Row="0" x:Name="GridView_ButtonsQuest"
    ItemTemplate="{StaticResource gridviewQuestStyle}"
    ItemsSource="{Binding Questions}" >
</GridView>

问题是一个清单:

public class Question
{
    public string QuestNumb { get; set; }
    public string QuestText { get; set; }
}

我的申请逻辑是:

    if(isAnswerRight)
{
  VisualStateManager.GoToState(???, "Right", false);
}
else
{
  VisualStateManager.GoToState(???, "Wrong", false);
}

请解释一下GoToState方法中第一个参数需要什么?

2 个答案:

答案 0 :(得分:1)

如果VisualState Switch出现在.cs文件中,用于Page或UserControl(不在MVVM视图模型中)。将名称属性应用于GridView

<GridView Grid.Row="0" x:Name="GridView_ButtonsQuest"
    ItemTemplate="{StaticResource gridviewQuestStyle}"
    ItemsSource="{Binding Questions}" 
    x:Name="myStateChanges" >
</GridView>

然后将其粘贴在GoToState()方法中。

if(isAnswerRight)
{
  VisualStateManager.GoToState(this.myStateChanges, "Right", false);
}
else
{
  VisualStateManager.GoToState(this.myStateChanges, "Wrong", false);
}

答案 1 :(得分:1)

与Listview有同样的问题。可以使用ItemContainerGenerator和VisualTreeHelper

访问模板内的Control
foreach (var item in GridView_ButtonsQuest.Items)
{
    var gridItem = (GridViewItem)MyList.ItemContainerGenerator.ContainerFromItem(item);
    var wrap1 =VisualTreeHelper.GetChild(gridItem , 0);
    var wrap2 = VisualTreeHelper.GetChild(wrap1 , 0);
   ...

我使用xmalspy来找出控件包含多少层。应该可以构建一些执行此递归的操作。

我遇到的另一个问题是你不能将GoToState与网格或按钮一起使用。但有人花了时间来开发支持它的ExtendedVisualStateManager,请参阅http://social.msdn.microsoft.com/Forums/en-GB/winappswithcsharp/thread/24dc19ff-15ed-4170-b3c3-d313728b642b

然后你可以编写ExtendedVisualStateManager.GoToElementState(...)