Вопрос

В Silverlight 3 я пытаюсь создать всплывающее меню для навигации. Я использую HyperlinkButton в качестве триггера, который при наведении мыши отображает всплывающее окно, содержащее больше HyperlinkButtons. Корневой узел выровнен по правому краю, и я хочу, чтобы подменю появилось слева. Моя проблема в том, что я пытаюсь расположить всплывающее окно, используя его свойство 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, поэтому любая помощь будет принята.

Это было полезно?

Решение

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

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

После вызова UpdateLayout внутренняя гиперссылка имеет свой естественный размер.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top