2011-04-14 5 views
9

У меня есть страница WPF. Страница имеет некоторый контент, но последний дочерний компонент корневого макета страницы - это пользовательский элемент управления, который я создал. Это выглядит следующим образом:WPF: Как ссылаться на другие элементы управления в триггере Свойство?

<UserControl DataContext=UserControlViewModel> 
    <UserControl.Resources> 
    <BooleanToVisibilityConverter x:Key="visibilityConverter" /> 
    </UserControl.Resources> 
    <Grid 
     Name="grid" 
     Visibility="{Binding IsOn, Converter={StaticResource visibilityConverter}}"> 
    <!-- Border to dim everything behind my user control --> 
    <Border Background="#000000" Opacity="0.4" /> 
    <!-- The following border is red and holds the content --> 
    <Border 
     Width="{Binding ElementName=txt, Path=ActualWidth}" 
     Height="{Binding ElementName=txt, Path=ActualHeight}" 
     Margin="{Binding ElementName=txt, Path=Margin}" 
     HorizontalAlignment="{Binding ElementName=txt, Path=HorizontalAlignment}" 
     VerticalAlignment="{Binding ElementName=txt, Path=VerticalAlignment}" 
     Background="Red"> 
     <TextBlock 
      Name="txt" 
      Width="200" 
      Height="100" 
      Margin="20" 
      HorizontalAlignment="Center" 
      VerticalAlignment="Center" 
      Text="This is my super awesome message!" /> 
    </Border> 
    </Grid> 
</UserControl> 

По умолчанию IsOn свойство UserControlViewModel объекта устанавливается в false, то есть пользовательский элемент управления не видно. Я внедрил некоторую логику, которая изменяет это свойство на true, а затем пользовательский элемент управления отображается перед всеми другими компонентами, которые затемнены. Это хорошо работает.

Теперь я хочу создать анимацию эффекта затухания, которая будет тускнуть компоненты, находящиеся за пользовательским элементом управления, как только она станет видимой. Затем я хочу сделать свою красную рамку, в которой содержимое будет исчезать с левой стороны, так что перемещение + исчезновение.

Начнем с эффекта затухания. Я написал этот стиль к Border, который должен сделать затемнение фоновых компонентов:

<UserControl DataContext=UserControlViewModel> 
    <UserControl.Resources> 
    <BooleanToVisibilityConverter x:Key="visibilityConverter" /> 
    </UserControl.Resources> 
    <Grid 
     Name="grid" 
     Visibility="{Binding IsOn, Converter={StaticResource visibilityConverter}}"> 
    <!-- Border to dim everything behind my user control --> 
    <Border Background="#000000" Opacity="0.4"> 
     <!-- The following style is new code --> 
     <Border.Style> 
     <Style TargetType="Border"> 
      <Style.Triggers> 
      <Trigger Property="{Binding ElementName=grid, Visibility}" Value="Visible"> 
       <Trigger.EnterActions> 
       <BeginStoryboard> 
        <Storyboard> 
        <DoubleAnimation 
         Storyboard.TargetProperty="Opacity" 
         From="0.0" 
         To="0.4" 
         Duration="0:0:1" /> 
        </Storyboard> 
       </BeginStoryboard> 
       </Trigger.EnterActions> 
      </Trigger> 
      </Style.Triggers> 
     </Style> 
     </Border.Style> 
    </Border> 
    ... 

Но есть проблема: я не могу установить связывание на спусковом Property, потому что это не свойство зависимостей. Мне нужен способ сообщить, что мой триггер срабатывает, как только grid имеет свойство Visibility, установленное на Visible. Пожалуйста, помогите и спасибо!

Вторая проблема заключается в том, что я не знаю, как сделать перемещение красной границы, поэтому мне нужна помощь и в некоторых преобразованиях масштаба, я думаю ... Спасибо еще раз!

ответ

15

попытка заменить следующую строку:

Оригинал:

<Trigger Property="{Binding ElementName=grid, Visibility}" Value="Visible"> 

Замена:

<DataTrigger Binding={Binding Visibility, ElementName=grid} Value="Visibile"> 
+0

Он работает, здорово! – Boris

+0

Это работает только в первый раз! ЗАЧЕМ!? – Boris

+0

@myermian: Я не совсем уверен, что вы имели в виду. Не могли бы вы объяснить это еще в нескольких предложениях? Благодарю. – Boris

Смежные вопросы