2

我有一个具有以下DataTemplate设置的列表框,ItemTemplate我想VisualState使用 Codebehind 更改它。

数据模板:

<DataTemplate x:Key="SortedRecommendationTemplate">
    <Border x:Name="asds">
        <VisualStateManager.VisualStateGroups>
            <VisualStateGroup x:Name="VisualStateGroup">
                <VisualState x:Name="OnlyNameState">
                    <Storyboard>
                        ...
                    </Storyboard>
                </VisualState>
                <VisualState x:Name="OnlyImageState"/>
                <VisualState x:Name="AllInfoState">
                    <Storyboard>
                        ...
                    </Storyboard>
                </VisualState>
            </VisualStateGroup>
        </VisualStateManager.VisualStateGroups>
        <Grid>
            ...
        </Grid
    </Border>
</DataTemplate>

这是我用来获取边框的代码(FindChild 来自How to find element in visual tree? wp7)并更改 VisualState

var blub = FindChild<Border>(listBox, "asds");
VisualStateManager.GoToState(blub, "AllInfoState", true);

但是,GoToStates 返回 false。blub 确实是我想要的边框(嗯,它是第一个 Listboxitem)但是 VisualStates 似乎有效,因为当我使用 Blend 中的 Behaviors 时,它们实际上确实发生了变化:

触发器:

<i:Interaction.Triggers>
    <i:EventTrigger EventName="MouseEnter">
        <ei:GoToStateAction StateName="AllInfoState" TargetObject="{Binding ElementName=asds}"/>
    </i:EventTrigger>
    <i:EventTrigger EventName="MouseLeave">
        <ei:GoToStateAction StateName="OnlyNameState" TargetObject="{Binding ElementName=asds}"/>
    </i:EventTrigger>

有人知道发生了什么吗?提前致谢!

4

1 回答 1

4

这是因为Border不是 a Control,而是 a FrameworkElementVisualStateManager.GoToState(Control control, string stateName, bool useTransitions)但是仅适用于Control.

您可以使用ExtendedVisualStateManager.GoToElementState(FrameworkElement root, string stateName, bool useTransitions)在 Microsoft.Expression.Interactivity.Core 中可以找到的内容。我想这就是 Blend 在内部使用的。

于 2012-10-20T14:43:08.397 回答