C# Silverlight弹出窗口实际化

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

在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>
我尝试过使用弹出窗口的子窗口宽度,但在MouseEnter事件期间,它被设置为0,因为它是隐藏的


我是Silverlight的新手,希望您能提供帮助。

弹出窗口将扩展以填充网格列,但直到显示了
弹出窗口之后,
弹出窗口的内容才被实际测量和定位。您可以通过命名
超链接的内容来解决此问题。假设内部的
超链接
名为
s
。然后,您可以将事件处理程序修改为:

private void hl_MouseEnter(object sender, MouseEventArgs e)
{
  p.IsOpen = true;
  p.UpdateLayout();
  p.HorizontalOffset = -s.ActualWidth;
}
调用
UpdateLayout
后,内部的
Hyperlink
具有其自然大小


不幸的是,
弹出窗口
会在鼠标离开父
超链接
时关闭,从而无法单击子
超链接

弹出窗口
会展开以填充网格列,但是直到显示了
弹出窗口
之后,才会实际测量和定位
弹出窗口的内容。您可以通过命名
超链接的内容来解决此问题。假设内部的
超链接
名为
s
。然后,您可以将事件处理程序修改为:

private void hl_MouseEnter(object sender, MouseEventArgs e)
{
  p.IsOpen = true;
  p.UpdateLayout();
  p.HorizontalOffset = -s.ActualWidth;
}
调用
UpdateLayout
后,内部的
Hyperlink
具有其自然大小


不幸的是,
弹出窗口
在鼠标离开父
超链接
时关闭,使得无法单击子
超链接

我可以解决这个问题。我不知道UpdateLayout,非常感谢!我可以解决这个问题。我不知道UpdateLayout,非常感谢!