代码之家  ›  专栏  ›  技术社区  ›  Misko

Silverlight弹出窗口实际化

  •  1
  • Misko  · 技术社区  · 15 年前

    在Silverlight3中,我尝试创建一个用于导航的弹出菜单。我使用HyperlinkButton作为触发器,当鼠标悬停在上面时,会显示一个包含更多HyperlinkButton的弹出窗口。根节点是右对齐的,我希望子菜单显示在左侧。我的问题是,我试图使用其ActualWidth属性定位弹出窗口,但该值在根元素(包含触发器和弹出窗口)的大小上是固定的,因此,如果弹出窗口较窄,则会留下难看的间隙,如果较宽,则会覆盖触发器。

    这是我的XAML:

    <Grid x:Name="LayoutRoot" Background="White">
        <Grid.Resources>
            <Style x:Key="MenuItemStyle" TargetType="HyperlinkButton">
                <Setter Property="Background" Value="Blue" />
                <Setter Property="Foreground" Value="White" />
                <Setter Property="HorizontalContentAlignment" Value="Center" />
            </Style>
        </Grid.Resources>
    
        <Grid x:Name="Root" HorizontalAlignment="Right" VerticalAlignment="Top">
            <HyperlinkButton 
                x:Name="hl"  
                Style="{StaticResource MenuItemStyle}"
                MouseEnter="hl_MouseEnter" MouseLeave="hl_MouseLeave">
                <HyperlinkButton.Content>
                    <Grid>
                        <TextBlock Text="MenuRoot" />
                    </Grid>
                </HyperlinkButton.Content>
            </HyperlinkButton>
    
            <Popup x:Name="p">
                <Popup.Child>
                    <HyperlinkButton 
                        Style="{StaticResource MenuItemStyle}">
                        <HyperlinkButton.Content>
                            <StackPanel>
                                <TextBlock Text="Sub" />
                            </StackPanel>
                        </HyperlinkButton.Content>
                    </HyperlinkButton>
                </Popup.Child>
            </Popup>
        </Grid>
    </Grid>
    

    我的代码是:

        private void hl_MouseEnter(object sender, MouseEventArgs e)
        {
            p.HorizontalOffset = -p.ActualWidth;
            p.IsOpen = true;
        }
    
        private void hl_MouseLeave(object sender, MouseEventArgs e)
        {
            p.IsOpen = false;
        }
    

    我尝试过使用弹出窗口的子窗口宽度,但在MouseEnter事件期间,它被设置为0,因为它是隐藏的。

    1 回复  |  直到 15 年前
        1
  •  5
  •   Martin Liversage    15 年前

    这个 Popup 弹出窗口 直到 弹出窗口 已显示。您可以通过命名 Hyperlink . 假设内部 超链接 s . 然后,您可以将事件处理程序修改为:

    private void hl_MouseEnter(object sender, MouseEventArgs e)
    {
      p.IsOpen = true;
      p.UpdateLayout();
      p.HorizontalOffset = -s.ActualWidth;
    }
    

    UpdateLayout 内心 有它的自然大小。

    弹出窗口 鼠标离开父对象后立即关闭 使其无法单击子对象 超链接 .