VisualStateManager.GotoState在ChildWindow中不起作用

时间:2011-03-28 16:55:08

标签: silverlight-4.0 visualstatemanager

我的Silverlight 4应用程序中有一个ChildWindow,定义了2个视觉状态。

当我在Blend中预览时,视觉状态执行我想要的操作,但是当我调用ViewStateManager.GotoState时,它返回false并且视觉状态未转换。

继承我的XAML。适用于长度的应用......

<controls:ChildWindow xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                      xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
                      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
                      xmlns:controls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls" 
                      xmlns:Controls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data.Input" 
                      xmlns:Controls1="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data" 
                      xmlns:Interactivity="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" 
                      xmlns:Behaviors="clr-namespace:Civica.UI.Common.Behaviors;assembly=Civica.UI.Common"
                      xmlns:Controls2="clr-namespace:Civica.UI.Common.Controls;assembly=Civica.UI.Common" 
                      xmlns:Helpers="clr-namespace:Civica.UI.Common.Helpers;assembly=Civica.UI.Common" 
                      x:Class="Civica.UI.Administration.Staff.StaffSearch.StaffSearchView"
                      mc:Ignorable="d"
                      d:DesignHeight="300" d:DesignWidth="400"
                      Width="800"
                      Helpers:VisualStateHelper.VisualStateName="{Binding Path=VisualStateName}">

    <controls:ChildWindow.Title>
        <TextBlock Text="Staff Search" Margin="0,4" TextWrapping="Wrap" />
    </controls:ChildWindow.Title>

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*" />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>
        <VisualStateManager.VisualStateGroups>
            <VisualStateGroup x:Name="SearchResultsStateGroup">
                <VisualState x:Name="NoSearchResults">
                    <Storyboard>
                        <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Visibility)" Storyboard.TargetName="border">
                            <DiscreteObjectKeyFrame KeyTime="0">
                                <DiscreteObjectKeyFrame.Value>
                                    <Visibility>Visible</Visibility>
                                </DiscreteObjectKeyFrame.Value>
                            </DiscreteObjectKeyFrame>
                        </ObjectAnimationUsingKeyFrames>
                        <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Visibility)" Storyboard.TargetName="textBlock">
                            <DiscreteObjectKeyFrame KeyTime="0">
                                <DiscreteObjectKeyFrame.Value>
                                    <Visibility>Visible</Visibility>
                                </DiscreteObjectKeyFrame.Value>
                            </DiscreteObjectKeyFrame>
                        </ObjectAnimationUsingKeyFrames>
                        <DoubleAnimation Duration="0" To="0.3" Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="dataGrid" d:IsOptimized="True"/>
                    </Storyboard>
                </VisualState>
            </VisualStateGroup>
        </VisualStateManager.VisualStateGroups>
        <Grid Margin="0,0,0,7">
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto "/>
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto" />
                <ColumnDefinition Width="*" />
            </Grid.ColumnDefinitions>

            <Controls:Label Content="Search for:" Margin="0,0,10,0"/>

            <Controls2:CommandTextBox Grid.Row="1" Grid.Column="1" 
                                      ImageHeight="16" ImageWidth="16"
                                      Text="{Binding CurrentSearchTerm, Mode=TwoWay}"
                                      Command="{Binding SearchCommand}" 
                                      CommandParameter="{Binding CurrentSearchTerm}"
                                      Image="/Civica.UI.Common.Images;component/Resources/Icons/16x16/RGB/icon-search-tiny.png" />
        </Grid>

        <Grid Grid.Row="1">
            <Controls1:DataGrid x:Name="dataGrid" AutoGenerateColumns="False" 
                                IsReadOnly="True"
                                AreRowGroupHeadersFrozen="True" 
                                CanUserResizeColumns="True" 
                                ItemsSource="{Binding CurrentSearchResults}"
                                SelectedItem="{Binding CurrentlySelectedSearchResult, Mode=TwoWay}"
                                VerticalScrollBarVisibility="Auto"
                                Height="300">
                <Interactivity:Interaction.Behaviors>
                    <Behaviors:DataGridDoubleClickBehaviour DoubleClickCommand="{Binding SelectSearchResultCommand}" 
                                                            CommandParameter="{Binding CurrentlySelectedSearchResult}"/>
                </Interactivity:Interaction.Behaviors>
                <Controls1:DataGrid.Columns>
                    <Controls1:DataGridTextColumn Header="Name" Binding="{Binding DisplayName}" IsReadOnly="True" />
                    <Controls1:DataGridTextColumn Header="Phone" Binding="{Binding TelephoneNumber}" IsReadOnly="True" />
                    <Controls1:DataGridTextColumn Header="Location" Binding="{Binding Location}" IsReadOnly="True" />
                </Controls1:DataGrid.Columns>
            </Controls1:DataGrid>
            <TextBlock x:Name="textBlock" Text="No Results Found" Foreground="Black" Opacity="1" FontSize="13" VerticalAlignment="Top" HorizontalAlignment="Center" Margin="30" Visibility="Collapsed"/>
            <Border x:Name="border" Background="Black" Opacity="0.3" Visibility="Collapsed"/>
        </Grid>        
    </Grid>
</controls:ChildWindow>

VisualStateHelper.VisualStateName只是一个附加属性,在更改值时调用VisualStateManager。该属性的实现可能不是问题,因为它在别处工作。

private static void OnVisualStateNameChanged(object sender, DependencyPropertyChangedEventArgs args)
{
     var visualStateName = (string)args.NewValue;
     var control = sender as Control;
     if (control == null)
     {
        throw new ArgumentException(Resources.VisualStateHelperSenderNotAControlErrorMessage, "sender");
     }

     VisualStateManager.GoToState(control, visualStateName, true);
}

2 个答案:

答案 0 :(得分:3)

我对Silverlight很新,但我在Google上发现了这个问题,看起来它解决了你遇到的问题:

Using Visual State Manager with Silverlight Toolkit’s Child Windows control

答案 1 :(得分:2)

它不适用于ChildWindow,但适用于UserControl或Normal Page

VisualStateManager.GoToState(this, "MyState", true);

当你在ChildWindow

时,解决方案是使用下面的代码
ExtendedVisualStateManager.GoToElementState(this.LayoutRoot as FrameworkElement, "MyState", true);

由于