1

如何通过VisualStateManager动态更改视觉行为而不更改现有控件的视觉结构(外观)。如何动态更改XAML中控件的视觉行为

我遇到的情况,我在ItemsControl定义生成的CheckBoxes和相关TextBoxes列表DataTemplate

XAML:

<DataTemplate> 
    <Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="0.2*" /> 
     <ColumnDefinition Width="0.8*" /> 
    </Grid.ColumnDefinitions>       
    <CheckBox Grid.Column="0" x:Name="chkBox" /> 
    <TextBox Grid.Column="1" x:Name="txtBox" /> 
    </Grid> 
</DataTemplate> 

我想躲最初相关TextBoxes但后来当CheckBoxChecked相关TextBox应该会出现。所以我写了VisualStateManager,但我没有确切的想法如何使用它或实现所需的行为。

VisualStateManager:

<vsm:VisualStateManager.VisualStateGroups> 
    <vsm:VisualStateGroup x:Name="CheckStates"> 
    <vsm:VisualState x:Name="Checked"> 
     <Storyboard> 
     <ObjectAnimationUsingKeyFrames Duration="0" Storyboard.TargetName="txtBox" Storyboard.TargetProperty="Visibility"> 
      <DiscreteObjectKeyFrame KeyTime="0"> 
      <DiscreteObjectKeyFrame.Value> 
       <vsm:Visibility>Collapsed</vsm:Visibility> 
      </DiscreteObjectKeyFrame.Value> 
      </DiscreteObjectKeyFrame> 
     </ObjectAnimationUsingKeyFrames> 
     </Storyboard> 
     </vsm:VisualState> 
     <vsm:VisualState x:Name="Unchecked"> 
     <Storyboard> 
      <ObjectAnimationUsingKeyFrames Duration="0" Storyboard.TargetName="txtBox" Storyboard.TargetProperty="Visibility"> 
      <DiscreteObjectKeyFrame KeyTime="0"> 
      <DiscreteObjectKeyFrame.Value> 
       <vsm:Visibility>Visible</vsm:Visibility> 
      </DiscreteObjectKeyFrame.Value> 
      </DiscreteObjectKeyFrame> 
     </ObjectAnimationUsingKeyFrames> 
     </Storyboard> 
    </vsm:VisualState> 
    </vsm:VisualStateGroup> 
</vsm:VisualStateManager.VisualStateGroups> 

回答

2

我不知道你是否可以针对与Visual美国另一控件的属性 - 这是可能的,但我不知道如果你能。

您是否尝试过使用Interactivity?

为了达到此目的,您需要参考System.Windows.Interactivity DLL(不确定它位于何处 - 可能会附带Microsoft Expression Blend/Studio)。您还需要导入这些:

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"    
xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions" 

,然后将此代码应工作,以显示文本框:

<CheckBox Grid.Column="0" x:Name="chkBox"> 
    <i:Interaction.Triggers> 
    <i:EventTrigger EventName="Checked"> 
     <ei:ChangePropertyAction TargetObject="{Binding ElementName=txtBox}" PropertyName="Visibility" Value="Visible"/> 
    </i:EventTrigger> 
</i:Interaction.Triggers> 
</Checkbox> 

,并改回:

<i:EventTrigger EventName="UnChecked"> 
    <ei:ChangePropertyAction TargetObject="{Binding ElementName=txtBox}" PropertyName="Visibility" Value="Collapsed"/> 
</i:EventTrigger> 

触发都必须在里面复选框<复选框>HERE < /复选框>。此代码未经测试,因此可能不完全正确。如果它不起作用,只要在ChangePropertyAction上搜索,你会发现比这个更好的例子。我不知道这将如何反应在itemcontrol里面......但我相信它会起作用。

相关问题