2011-03-28 6 views
1

2 개의 시각적 상태가 정의 된 Silverlight 4 응용 프로그램에 ChildWindow가 있습니다.VisualStateManager.GotoState가 ChildWindow 내에서 작동하지 않습니다.

시각적 상태는 내가 블렌드에서 미리보기를 원하지만 ViewStateManager.GotoState를 호출하면 false를 반환하고 시각적 상태가 전환되지 않습니다.

Heres my XAML. 길이에 대한 Appologies ...

<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

그것을 수행하지 않는 ChildWindow의 작품, 하지만 UserControl을 또는 일반 페이지에서 작동

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

솔루션은 당신이 ChildWindow

에있을 때 아래의 코드를 사용하는 것입니다
ExtendedVisualStateManager.GoToElementState(this.LayoutRoot as FrameworkElement, "MyState", true); 

감사

관련 문제