2017-02-06 1 views
1

Als this MSDN page suggests sollten Sie die Datenbindung verwenden können, um ein Placement-Ziel für eine QuickInfo festzulegen.Ermitteln des Placement-Ziels einer QuickInfo im Code hinter

In meiner UWP App habe ich folgende XAML und Code hinter:

<Button x:Name="MyButton"> 
    <ToolTipService.ToolTip> 
     <ToolTip PlacementTarget="{Binding ElementName=MyButton}" 
       Loaded="FunkyMethod"> 
      <Border Width="150" 
        Height="50" 
        CornerRadius="10" 
        Background="DeepSkyBlue"> 
       <TextBlock Text="This is a tooltip" 
          HorizontalAlignment="Center" 
          VerticalAlignment="Center" 
          Foreground="White"/> 
      </Border> 
     </ToolTip> 
    </ToolTipService.ToolTip> 

    <Button.Content>Button with ToolTip</Button.Content> 
</Button> 
private void FunkyMethod(object sender, RoutedEventArgs e) 
{ 
    var tooltip = sender as ToolTip; 
    var button = tooltip?.PlacementTarget as Button; // always returns NULL for the placement target 

    if (tooltip != null && button != null) 
    { 
     // do something funcky here. 
    } 
} 

Aber das Platzierungsziel wird nie gesetzt und ich immer NULL bekommen. Weiß jemand warum?

Für den Kontext versuche ich Code zu schreiben, der den horizontalen/vertikalen Offset berechnen würde, der benötigt wird, um einen Tooltip rechts von seinem übergeordneten und vertikal zentriert zu platzieren. Etwas wie folgt aus:

enter image description here

Aber ich habe nicht in der Lage gewesen, eine Art und Weise, dies zu erreichen (Placement = rechts oder von oben hat nicht funktioniert) zu finden. Also was ich versuche ist, es in Code hinter zur Laufzeit zu tun, durch a) setzen Placement = Maus, b) herauszufinden, die Elternkontrolle über PlacementTarget, c) herauszufinden, die Mausposition relativ zum übergeordneten Steuerelement, d) Berechnen Sie den horizontalen/vertikalen Offset und setzen Sie ihn für den Tooltip

+2

Wer downvoted und stimmten diese schließen? Das ist eine absolut gültige Frage. –

Antwort

0

Also habe ich noch nicht wieder von Microsoft von diesem gehört. Justin XL wies darauf hin, dass x: Bind in einigen Szenarien sauber funktionieren würde. Aber ich konnte einen Workaround finden, der für meine Szenarien funktioniert. Hier sind die Schnipsel:

<Style x:Key="ToolTipStyle1" 
     TargetType="ToolTip"> 
    <Setter Property="Placement" 
      Value="Mouse" /> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="ToolTip"> 
       <Grid x:Name="LayoutRoot" 
         MaxWidth="300" 
         MinHeight="36" 
         MaxHeight="300"> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="Auto" /> 
         <ColumnDefinition Width="*" /> 
        </Grid.ColumnDefinitions> 

        <Polygon Fill="#FF1589EE" 
          Width="10" 
          Height="12" 
          VerticalAlignment="Center" 
          Points="0,6 10,0 10,12" /> 

        <Border Grid.Column="1" 
          Background="#FF1589EE"> 
         <TextBlock Margin="20,5,5,5" 
            HorizontalAlignment="Left" 
            VerticalAlignment="Center" 
            Foreground="White" 
            FontSize="16" 
            TextWrapping="Wrap" 
            TextTrimming="CharacterEllipsis" 
            Text="{TemplateBinding Content}" /> 
        </Border> 

        <VisualStateManager.VisualStateGroups> 
         <VisualStateGroup x:Name="OpenStates"> 
          <VisualState x:Name="Closed"> 
           <Storyboard> 
            <FadeOutThemeAnimation TargetName="LayoutRoot" /> 
           </Storyboard> 
          </VisualState> 
          <VisualState x:Name="Opened"> 
           <Storyboard> 
            <FadeInThemeAnimation TargetName="LayoutRoot" /> 
           </Storyboard> 
          </VisualState> 
         </VisualStateGroup> 
        </VisualStateManager.VisualStateGroups> 
       </Grid> 

      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

<Button Width="150" 
     Height="100" 
     PointerMoved="MyButton_OnPointerMoved" 
     PointerExited="MyButton_OnPointerExited" 
     Content="Parent Control"> 
    <ToolTipService.ToolTip> 
     <ToolTip Loaded="MyToolTip_OnLoaded" 
        Style="{StaticResource ToolTipStyle1}" 
        Content="This is a tooltip" /> 
    </ToolTipService.ToolTip> 
</Button> 
public sealed partial class MainPage : Page 
{ 
    public MainPage() 
    { 
     this.InitializeComponent(); 
    } 

    private PointerPoint _devicePointer; 
    private FrameworkElement _elementContainingDevicePointer; 
    private void MyButton_OnPointerMoved(object sender, PointerRoutedEventArgs e) 
    { 
     _elementContainingDevicePointer = sender as FrameworkElement; 
     _devicePointer = e.GetCurrentPoint(_elementContainingDevicePointer); 
    } 

    private void MyButton_OnPointerExited(object sender, PointerRoutedEventArgs e) 
    { 
     _devicePointer = null; 
     _elementContainingDevicePointer = null; 
    } 

    private void MyToolTip_OnLoaded(object sender, RoutedEventArgs e) 
    { 
     var tooltip = sender as ToolTip; 

     if (_devicePointer != null && _elementContainingDevicePointer != null && tooltip != null) 
     { 
      var x = _elementContainingDevicePointer.ActualWidth - Math.Max(0, _devicePointer.Position.X); 
      var y = _elementContainingDevicePointer.ActualHeight/2 - Math.Max(0, _devicePointer.Position.Y) - tooltip.ActualHeight/2; 

      tooltip.HorizontalOffset = x + 5; 
      tooltip.VerticalOffset = y - 10; 
     } 
    } 
} 
2

Versuchen Sie, die traditionelle Bindung zu PlacementTarget="{x:Bind MyButton}" zu ändern. Beachten Sie die Standardeinstellung Mode davon ist OneTime, aber ich denke, es ist OK für Ihren Fall.

+0

Danke, das hat funktioniert. Verstehe nicht, warum die traditionelle Bindung nicht funktioniert hat, aber das entblößt mich so danke. –

+0

@MeisamSeyedAliroteh könnte dies ein Fehler sein. :) –

+0

also würde der x: Bind-Ansatz nicht funktionieren, wenn ich eine Datenvorlage für mein Steuerelement verwende und der Tooltip in dieser Datenvorlage definiert ist. Irgendwelche Ideen, wie man dieses Problem umgehen kann? Ich baue ein Menü für meine App, im Wesentlichen mit einem SplitView, um ein ListView mit ItemSource und ItemTemplate zu hosten, und jedes Element würde einen Tooltip haben, so dass ich den Tooltip und seinen Host in einer Datenvorlage definieren muss. Wenn traditionelle Bindung funktionierte, wäre dieses Problem gelöst worden. –

Verwandte Themen