2016-02-23 6 views
1

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

Вот мой XAML:

<Window x:Class="MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:local="clr-namespace:WpfApplication1" 
     mc:Ignorable="d" 
     Title="MainWindow" Height="350" Width="525"> 
    <Window.Resources> 
     <local:MyTooltipConverter x:Key="MyTooltipConverter" /> 
    </Window.Resources> 
    <Grid> 
     <DataGrid x:Name="dataGrid" ItemsSource="{Binding}" HorizontalAlignment="Left" VerticalAlignment="Top" Height="263" Width="507"> 
      <DataGrid.Resources> 
       <Style TargetType="{x:Type DataGridRow}"> 
        <Setter Property="ToolTip"> 
         <Setter.Value> 
          <ToolTip Content="{Binding ??, Converter={StaticResource MyTooltipConverter}}" /> 
         </Setter.Value> 
        </Setter> 
       </Style> 
      </DataGrid.Resources> 
     </DataGrid> 
    </Grid> 
</Window> 

И код ...

Imports System.Globalization 

Class MainWindow 

    Public Class Person 
     Public Property Name As String 
    End Class 

    Public Persons As New List(Of Person) 

    Private Sub MainWindow_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded 
     For i As Integer = 0 To 5 
      Persons.Add(New Person With {.Name = "Test " + i.ToString}) 
     Next 
     dataGrid.DataContext = Persons 
    End Sub 

End Class 


Public Class MyTooltipConverter 
    Implements IValueConverter 

    Public Function Convert(value As Object, targetType As Type, parameter As Object, culture As CultureInfo) As Object Implements IValueConverter.Convert 
     If value Is Nothing Then 
      Return Nothing 
     End If 

     Dim panel As New StackPanel() 
     panel.Orientation = Orientation.Vertical 

     Dim block As New TextBlock() 
     block.Text = Now.ToString 
     panel.Children.Add(block) 

     Dim tip As New ToolTip() 
     tip.Content = panel 

     Return tip 
    End Function 

    Public Function ConvertBack(value As Object, targetType As Type, parameter As Object, culture As CultureInfo) As Object Implements IValueConverter.ConvertBack 
     Throw New NotImplementedException() 
    End Function 
End Class 

Как я могу позвонить MyTooltipConveter аф получить подсказку с текущим временем?

Благодаря

+0

Вы должны добавить DataTemplate для каждого элемента и определить всплывающую подсказку после этого я думаю. Внутри datatemplate вы можете использовать sth, как это. albatross

ответ

1

Изменить ваш метод MyTooltipConverter.Convert Вернуться панели. Возвратный совет выдает System.InvalidOperationException - «ToolTip» не может иметь логического или визуального родителя.

Что касается привязки, то просто используется преобразователь.

<ToolTip Content="{Binding Converter={StaticResource MyTooltipConverter}}" /> 

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

Что-то вроде этого:

Public Class MyTooltipConverter 
    Implements IValueConverter 

    Public Function Convert(value As Object, targetType As Type, parameter As Object, culture As CultureInfo) As Object Implements IValueConverter.Convert 
     If value Is Nothing Then 
      Return Nothing 
     End If 

     Dim panel = New StackPanel() 
     panel.Orientation = Orientation.Vertical 

     Dim block As New TextBlock() 
     block.Text = Now.ToString 
     panel.Children.Add(block) 

     Dim timer As New System.Windows.Threading.DispatcherTimer() 
     timer.Interval = New TimeSpan(0, 0, 1) 
     AddHandler timer.Tick, Sub() 
            block.Text = Now.ToString 
           End Sub 
     timer.Start() 
     Debug.WriteLine("Timer Started") 

     AddHandler panel.Unloaded, Sub(s, e) 
             timer.Stop() 
             timer = Nothing 
             panel = Nothing 
             Debug.WriteLine("Timer Stopped") 
            End Sub 

     Return panel 
    End Function 

    Public Function ConvertBack(value As Object, targetType As Type, parameter As Object, culture As CultureInfo) As Object Implements IValueConverter.ConvertBack 
     Throw New NotImplementedException() 
    End Function 
End Class 
+0

Wow - спасибо! Я очень ценю вашу помощь! Попытались разобраться в этом весь день, поэтому ваша помощь много значит! – MojoDK

+1

Рад помочь. Иногда я участвую, когда помогаю другим, поэтому я считаю это взаимной выгодой. Например, я обычно код на C#, поэтому я просто научился добавлять обработчики событий и «анонимные» методы в VB. –