【问题标题】:Accesing parent elements in WPF C#在 WPF C# 中访问父元素
【发布时间】:2021-05-10 23:07:01
【问题描述】:

我无法到达与事件触发器不在同一个网格中的按钮。 在一个网格中,我们有一个触发器:

<Grid x:Name="BottomGrid" Margin="0, 30, 0, 0" >
    <EventTrigger RoutedEvent="ButtonBase.Click" SourceName="OpenMenuButton">
            <BeginStoryboard Storyboard="{StaticResource MenuOpen}"></BeginStoryboard>
    </EventTrigger>
    ...
</Grid>

在第二个中,有一个按钮 OpenMenuButton

<Grid x:Name ="TopGrid" Height="30" VerticalAlignment="Top" Background="#FF299FDD" >
    <Grid x:Name="ButtonGrid">
          <Button Name="CloseMenuButton" VerticalAlignment="Center" Style="{DynamicResource MaterialDesignFlatButton}"  Content="{materialDesign:PackIcon ArrowCollapseRight}" ToolTip="Icon" Click="ButtonCloseMenu_Click"/>
          <Button Name="OpenMenuButton" VerticalAlignment="Center" Style="{DynamicResource MaterialDesignFlatButton}"  Content="{materialDesign:PackIcon Menu}" ToolTip="Icon" Visibility="Collapsed"  Click="ButtonOpenMenu_Click"/>
    </Grid>
    ...
</Grid>

但是有一个问题,EvenTrigger 找不到 OpenMenuButton,因为它位于树中的其他位置。 TopGrid.ButtonGrid.OpenMenuButton 之类的东西不起作用。什么是正确的相对路径及其语法?

【问题讨论】:

  • 文档 (docs.microsoft.com/en-us/dotnet/api/…) 说:您可以将此属性设置为应用触发器集合(此 EventTrigger 所属的集合)范围内的任何元素的名称。这通常是包含此 EventTrigger 的模板中的命名元素。如果您直接在元素上设置 Triggers 属性,则它是该父元素范围内的命名元素。

标签: c# wpf triggers grid relative-path


【解决方案1】:

使用BooleanAnimationUsingKeyFrames 更改boolean 值。 还将toryboard.TargetName = "MyMenu" 设置为您要通过点击事件控制的菜单的名称,并将Storyboard.TargetProperty = "IsSubmenuOpen" 设置为菜单打开功能。

<Grid>
  <Grid.Triggers>
    <EventTrigger RoutedEvent="Button.Click" SourceName="OpenMenuButton">
      <BeginStoryboard Name="MyBeginStoryboard">
        <Storyboard>
          <BooleanAnimationUsingKeyFrames Storyboard.TargetName="MyMenu" Storyboard.TargetProperty="IsSubmenuOpen" Duration="0:0:1" FillBehavior="HoldEnd">
            <DiscreteBooleanKeyFrame Value="True" KeyTime="0:0:1" />
          </BooleanAnimationUsingKeyFrames>
        </Storyboard>
      </BeginStoryboard>
    </EventTrigger>
  </Grid.Triggers>
  <StackPanel>
    <Button Width="44" Height="34" Name="OpenMenuButton" Foreground="Black" Background="Red" Margin="8, 0, 0, 0" Content="Open Menu" HorizontalAlignment="Left">
    </Button>

    <Menu DockPanel.Dock="Top">
      <MenuItem Header="_File" Name="MyMenu">
      <MenuItem Header="_New" />
      <MenuItem Header="_Open" />
      <MenuItem Header="_Save" />
      <Separator />
      <MenuItem Header="_Exit" />
      </MenuItem>
    </Menu>
  </StackPanel>
</Grid>

或者如果你想从Storyboard里面的下面一行打开和关闭菜单并将button改为ToggleButton

 <DiscreteBooleanKeyFrame Value = "{Binding Path = IsChecked, ElementName = OpenMenuButton}" KeyTime = "0: 0: 1" />
       Use the BooleanAnimationUsingKeyFrames>

完整代码

<Grid>
  <Grid.Triggers>
    <EventTrigger RoutedEvent="Button.Click" SourceName="OpenMenuButton">
      <BeginStoryboard Name="MyBeginStoryboard">
        <Storyboard>
          <BooleanAnimationUsingKeyFrames Storyboard.TargetName="mymnu" Storyboard.TargetProperty="IsSubmenuOpen" Duration="0:0:1" FillBehavior="HoldEnd">
            <DiscreteBooleanKeyFrame Value="{Binding  Path=IsChecked,ElementName=OpenMenuButton}" KeyTime="0:0:1" />
          </BooleanAnimationUsingKeyFrames>
        </Storyboard>
      </BeginStoryboard>
    </EventTrigger>
  </Grid.Triggers>
  <StackPanel>
    <ToggleButton Width="44" Height="34" Name="OpenMenuButton" Foreground="Black" Background="Red" Margin="8, 0, 0, 0" Content="click" HorizontalAlignment="Left">
    </ToggleButton>

    <Menu DockPanel.Dock="Top">
      <MenuItem Header="_File" Name="mymnu">
      <MenuItem Header="_New" />
      <MenuItem Header="_Open" />
      <MenuItem Header="_Save" />
      <Separator />
      <MenuItem Header="_Exit" />
      </MenuItem>
    </Menu>
  </StackPanel>
</Grid>

【讨论】:

    猜你喜欢
    • 2021-09-05
    • 2017-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多