Как динамически изменить визуальное поведение элемента управления в XAML - PullRequest
1 голос
/ 13 февраля 2012

Как динамически изменить визуальное поведение с помощью VisualStateManager без изменения визуальной структуры (внешнего вида) существующего элемента управления.

У меня есть сценарий, в котором у меня есть DataTemplate, определенный в ItemsControl для генерациисписок CheckBoxes и связанных TextBoxes.

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, но позже, когда CheckBox равен Checked, должен появиться связанный 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>

1 Ответ

2 голосов
/ 13 февраля 2012

Я не знаю, можете ли вы нацелить свойства другого элемента управления с помощью Visual States - это может быть возможно, но я не уверен, что вы можете.

Вы пытались использовать интерактивность?

Чтобы это работало, вам нужна ссылка на библиотеку System.Windows.Interactivity (не уверен, где она находится - она ​​может поставляться с 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>

Оба триггера должны быть внутри флажка ЗДЕСЬ . Этот код не проверен, поэтому он может быть не совсем правильным. Если это не сработает, просто выполните поиск по ChangePropertyAction, и вы найдете лучшие примеры, чем этот. Я не уверен, как это отреагирует внутри элемента управления ... но я верю, что это сработает.

...