2017-02-06 9 views
1

Как this MSDN page suggests вы можете использовать привязку данных для установки цели размещения во всплывающей подсказке.Getting PlacementTarget всплывающей подсказки в коде за

В моем UWP приложение У меня есть следующий код XAML и код позади:

<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. 
    } 
} 

Но цель размещения никогда не будет установлен, и я всегда получаю NULL. Кто-нибудь знает, почему?

В контексте я пытаюсь написать код, который будет вычислять смещение по горизонтали/вертикали, необходимое для размещения всплывающей подсказки справа от родительского элемента и вертикально центрированного. Что-то вроде этого:

enter image description here

Но я не смог найти способ достижения этой цели (размещение = Right или Top не работает). Так что я пытаюсь сделать это в коде, находящемся во время выполнения, а) установить Placement = Mouse, b) определить родительский элемент управления через PlacementTarget, c) найти положение мыши относительно родительского элемента управления, d) вычислить горизонтальное/вертикальное смещение и установить его для всплывающей подсказки

+2

Кто downvoted и проголосовавшие, чтобы закрыть это? Это совершенно правильный вопрос. –

ответ

0

Так что я до сих пор не слышал от Microsoft об этом. Как указал Justin XL x: Bind будет работать чисто в некоторых сценариях. Но я смог найти обходное решение, которое работает для моих сценариев. Вот отрывки:

<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

Попробуйте изменить традиционную привязку к PlacementTarget="{x:Bind MyButton}". Обратите внимание, что значение по умолчанию Mode составляет OneTime, но я думаю, что все в порядке для вашего дела.

+0

Спасибо, что сработало. Не понимаю, почему традиционная привязка не работала, но это так сильно блокирует меня. –

+0

@MeisamSeyedAliroteh это вполне может быть ошибкой. :) –

+0

, так что подход x: Bind не будет работать, если я использую шаблон данных для своего элемента управления, а всплывающая подсказка определяет внутри этого шаблона данных. Любые идеи о том, как обойти эту проблему? Я создаю меню для своего приложения, в основном используя SplitView для размещения ListView с ItemSource и ItemTemplate, и каждый элемент будет иметь всплывающую подсказку, поэтому мне нужно определить всплывающую подсказку и ее хост в шаблоне данных. Если традиционная привязка работает, то эта проблема была бы решена. –