WPF:如何在触发器属性属性中引用其他控件?

Bor*_*ris 9 wpf xaml styles

我有一个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>
Run Code Online (Sandbox Code Playgroud)

默认情况下,对象的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>
    ...
Run Code Online (Sandbox Code Playgroud)

但问题是:我无法在触发器上设置绑定Property,因为它不是依赖属性.一旦设置gridVisibility属性,我需要一种方法来告诉我的触发器Visible.请帮助,谢谢!

第二个问题是,我不知道如何移动红色边框,所以我需要帮助一些规模转换,我猜...再次感谢!

m-y*_*m-y 16

尝试替换以下行:

原版的:

<Trigger Property="{Binding ElementName=grid, Visibility}" Value="Visible">
Run Code Online (Sandbox Code Playgroud)

替换:

<DataTrigger Binding={Binding Visibility, ElementName=grid} Value="Visibile">
Run Code Online (Sandbox Code Playgroud)