3

私の 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 メソッドの最初のパラメーターに必要なものを説明してください。

4

2 に答える 2

1

VisualStateスイッチがページまたはUserControlの.csファイルで発生した場合(MVVMビューモデルではない)。Nameプロパティを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);
}
于 2012-10-04T18:28:15.297 に答える
1

リストビューでも同じ問題がありました。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 を使用できないことです。しかし、誰かが時間をかけて、それをサポートする ExtendedVisualStateManager を作成しました。

その後、 ExtendedVisualStateManager.GoToElementState(...) を書くことができます

于 2012-12-19T16:12:07.917 に答える