Всплывающее окно Silverlight ActualSize

В Silverlight 3 я пытаюсь создать всплывающее меню для навигации. Я использую 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, поскольку оно скрыто.

Я новичок в Silverlight, поэтому буду благодарен за любую помощь.


person Misko    schedule 29.07.2009    source источник


Ответы (1)


Popup расширяется, заполняя столбец сетки, но содержимое Popup фактически не измеряется и не позиционируется до тех пор, пока не будет отображен Popup. Вы можете обойти это, назвав содержимое Hyperlink. Предположим, что внутренний Hyperlink назван s. Затем вы можете изменить свой обработчик событий на это:

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

После вызова UpdateLayout внутренний Hyperlink имеет свой естественный размер.

К сожалению, Popup закрывается, как только указатель мыши покидает родительский Hyperlink, делая невозможным щелчок по дочернему Hyperlink.

person Martin Liversage    schedule 30.07.2009
comment
Я могу обойти эту проблему. Я не знал об UpdateLayout, большое спасибо! - person Misko; 30.07.2009