如何以编程方式改变silverlight中的视觉状态

本文关键字:视觉 状态 silverlight 改变 编程 方式 | 更新日期: 2023-09-27 18:16:19

我有以下代码(它只是一个ListBoxItem的Blend ControlTemplate加上两个新的状态和一个事件处理程序来简化示例):

xaml:

        <StackPanel>
        <Button Click="ButtonBase_OnClick" Content="Clicle"/>
        <ListBox Grid.Row="1" Margin="12,0,12,0" x:Name="list">
            <ListBox.Resources>
                <Style TargetType="ListBoxItem">
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="ListBoxItem">
                                <Border x:Name="LayoutRoot" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" HorizontalAlignment="{TemplateBinding HorizontalAlignment}" VerticalAlignment="{TemplateBinding VerticalAlignment}" MouseLeftButtonDown="LayoutRoot_OnMouseLeftButtonDown">
                                    <VisualStateManager.VisualStateGroups>
                                        <VisualStateGroup x:Name="CommonStates">
                                            <VisualState x:Name="Normal"/>
                                            <VisualState x:Name="MouseOver"/>
                                            <VisualState x:Name="Disabled"/>
                                        </VisualStateGroup>
                                        <VisualStateGroup x:Name="SelectionStates">
                                            <VisualState x:Name="Unselected"/>
                                            <VisualState x:Name="Selected"/>
                                        </VisualStateGroup>
                                        <VisualStateGroup x:Name="Custom">
                                            <VisualState x:Name="NotSet"/>
                                            <VisualState x:Name="Set"/>
                                        </VisualStateGroup>
                                    </VisualStateManager.VisualStateGroups>
                                    <ContentControl x:Name="ContentContainer" ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" Foreground="{TemplateBinding Foreground}" HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}"/>
                                </Border>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
            </ListBox.Resources>
        </ListBox>
    </StackPanel>

然后我后面的代码我试图设置这些新状态之一:

    private void LayoutRoot_OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        bool result = ExtendedVisualStateManager.GoToElementState(sender as FrameworkElement, "Set", true);
    }

无论我尝试什么,我总是得到result = false,所以状态没有改变。我对视觉状态很陌生,我做错了什么?

编辑:

我也尝试了下面的代码来使用ListBoxItem,但它也失败了:

        DependencyObject parent = VisualTreeHelper.GetParent(sender as FrameworkElement);
        var a = ExtendedVisualStateManager.GoToElementState(parent as FrameworkElement, "Set", false);
编辑:

我想我在查看VisualStateManager时发现了问题。它检查VisualStates是否存在,并且当前状态是否声明到Border中,而不是声明到ListBoxItem中(检查调用VisualStateManager.GetVisualGroups)。知道为什么吗?

如何以编程方式改变silverlight中的视觉状态

我没有使用ExtendedVisualStateManager,但我不认为它是合适的类。尝试VisualStateManager.GoToState并使用ListBoxItem(而不是Border,它是鼠标事件的发送者)作为目标控件。