2016-06-10 23 views
0

Ich arbeite an einem interaktiven Diagramm, wo ich ein Popup mit mehr Informationen anzeigen kann, wenn der Benutzer auf einen Datenpunkt klickt. Das funktioniert soweit und dies funktioniert die Popup-Definition lautet:Platzieren eines Popups an der Spitze der Mauszeigerposition

<Popup IsOpen="{Binding PopupViewModel.IsOpen}" 
     Placement="Mouse" 
     HorizontalOffset="-150"> 
    <Popup.Resources> 
     <DataTemplate DataType="{x:Type ViewModels:DataPointPopUpContentViewModel}"> 
      <Views:DataPointPopUpContentView/> 
     </DataTemplate> 
    </Popup.Resources> 
    <Border BorderThickness="1" BorderBrush="Black" Background="White"> 
     <ContentPresenter Content="{Binding PopupViewModel}" /> 
    </Border> 
</Popup> 

die Standardplatzierung des Popup, bei der Verwendung von Placement="Mouse" an der rechten unteren Ecke des Maus-Cursor. Allerdings möchte ich das Popup nur an der oberen Kante des Mauszeigers platzieren. Wie Sie sehen können, habe ich die horizontale Zentrierung erreicht, indem ich HorizontalOffset="-150" gesetzt habe, was eine feste Popup-Breite (Breite = 300) hat. Für die vertikale Platzierung habe ich das Problem, dass die Popup-Höhe nicht festgelegt ist, da ich ein Bild variabler Größe und Seitenverhältnis darin zeige. Ich habe daher versucht, VerticalOffset auf die ActualHeight des Pupup durch Hinzufügen VerticalOffset="{Binding ActualHeight}" zu setzen. Dies funktioniert leider nicht. Irgendwelche Ideen darüber, was ich falsch mache und wie ich mein Ziel erreiche?

Antwort

1

Zunächst einmal müssen Sie einen Konverter:

public class MultiplyConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     if (value is double && parameter is double) 
     { 
      return ((double)value) * ((double)parameter); 
     } 

     return value; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotSupportedException(); 
    } 
} 

Dann versuchen die VerticalOffset Eigenschaft auf die ActualHeight des Popup des Kindes zu binden:

<Window.Resources> 
    <local:MultiplyConverter x:Key="MultiplyConverter" /> 
    <sys:Double x:Key="Factor">-.5</sys:Double> 
</Window.Resources> 

<Popup IsOpen="{Binding PopupViewModel.IsOpen}" 
     Placement="Mouse" 
     HorizontalOffset="-150"> 
    <Popup.VerticalOffset> 
     <Binding Path="Child.ActualHeight" RelativeSource="{RelativeSource Self}" 
        Converter="{StaticResource MultiplyConverter}" ConverterParameter="{StaticResource Factor}" /> 
    </Popup.VerticalOffset> 


    <!-- popup content --> 
</Popup> 

Ich hoffe, dass es Ihnen helfen kann.