Silverlight Popup Actual
-
05-07-2019 - |
Frage
In Silverlight 3, Ich versuche, ein Pop-up-Menü für die Navigation zu erstellen. Ich verwende einen Hyperlink als Auslöser, die, wenn sie über ein Popup-Displays mit mehr HyperlinkButtons moused. Der Wurzelknoten ist rechts ausgerichtet, und ich möchte das Untermenü auf der linken Seite angezeigt werden. Mein Problem ist, dass ich versuche, das Popup mit seiner Actual Eigenschaft zu positionieren, aber dieser Wert erscheint auf der Größe des Wurzelelementes befestigt (die den Auslöser und das Popup enthält), so dass, wenn die Popup-enger ist es hinterlässt eine unansehnliche Lücke und wenn breiter überschreibt den Auslöser.
Hier ist meine 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>
und mein Code:
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;
}
Ich habe versucht, die Pop-up-Kinder Breite verwenden, aber dies wird auf 0 während der MouseEnter- Ereignis gesetzt, weil es versteckt ist.
Ich bin neu in Silverlight so dass jede Hilfe würde geschätzt.
Lösung
Die Popup
erweitern die Rasterspalte, aber der Inhalt des Popup
zu füllen ist nicht tatsächlich gemessen und positioniert ist, bis die Popup
angezeigt wurde. Sie können durch die Benennung den Inhalt der Hyperlink
dieses Problem umgehen. Es sei angenommen, dass der innere Hyperlink
ist s
benannt. Dann können Sie Ihre Ereignishandler diese ändern:
private void hl_MouseEnter(object sender, MouseEventArgs e)
{
p.IsOpen = true;
p.UpdateLayout();
p.HorizontalOffset = -s.ActualWidth;
}
Nach dem Aufruf der inneren UpdateLayout
Hyperlink
hat seine natürliche Größe.
Leider schließt das Popup
sobald die Maus den Eltern Hyperlink
lassen was es unmöglich macht, das Kind Hyperlink
zu klicken.