2012-05-09 56 views
3

在我Page.Resources我有DataTamplate:如何使用的DataTemplate在metro應用使用GotoState函數

<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方法中的第一個參數?

回答

1

如果VisualState開關出現在.cs文件中的頁面或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

與Listview有相同的問題。這可以通過使用ItemContainerGenerator和VisualTreeHelper

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。但有人已採取devlop,支持ExtendedVisualStateManager時候它看到http://social.msdn.microsoft.com/Forums/en-GB/winappswithcsharp/thread/24dc19ff-15ed-4170-b3c3-d313728b642b

,那麼你可以寫ExtendedVisualStateManager.GoToElementState(...)

相關問題