WPF: Как ссылаться на другие элементы управления в свойстве свойства триггера? - PullRequest
9 голосов
/ 14 апреля 2011

У меня есть страница 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. Пожалуйста, помогите и спасибо!

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

1 Ответ

16 голосов
/ 14 апреля 2011

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

Оригинал:

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

Замена:

<DataTrigger Binding={Binding Visibility, ElementName=grid} Value="Visibile">
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...