Закрытие является способом пойти. Таким образом, у Вас будет точная ссылка на элемент, который даже переживет некоторую перестановку DOM.
Пример для тех, кто не знает закрытия:
var saved_element = findThatDOMNode();
document.body.onclick = function()
{
alert(saved_element); // it's still there!
}
, Если необходимо было сохранить его в cookie, тогда я рекомендую вычислительный XPath для него (например, идите по DOM подсчет предыдущих одноуровневых элементов, пока Вы не найдете элемент с идентификатором, и Вы закончите с чем-то как [@id=foo]/div[4]/p[2]/a
).
XPointer является решением W3C той проблемы.
Я понял это, всплывающая подсказка имеет свойство PlacementTarget , которое определяет элемент пользовательского интерфейса, который имеет всплывающую подсказку. Если кому-то это понадобится:
<TextBlock Text="{Binding Text}">
<TextBlock.ToolTip>
<ToolTip
DataContext="{Binding Path=PlacementTarget, RelativeSource={x:Static RelativeSource.Self}}"
Visibility="{Binding Converter={StaticResource toolVisConverter}}">
<TextBlock Text="{Binding Text}"/> <!-- tooltip content -->
</ToolTip>
</TextBlock.ToolTip>
</TextBlock>
А затем напишите Converter, который преобразует TextBlock в Visibility (на основе ширины TextBlock).
Хорошо, а почему это только жесткий XAML-способ? Это работает:
<TextBlock Text="{Binding Text}"
IsMouseDirectlyOverChanged="TextBlock_IsMouseDirectlyOverChanged" >
<TextBlock.ToolTip>
<ToolTip Visibility="Collapsed">
<TextBlock Text="{Binding Text}"></TextBlock>
</ToolTip>
</TextBlock.ToolTip>
</TextBlock>
в Control.xaml.cs:
private void TextBlock_IsMouseDirectlyOverChanged(object sender, DependencyPropertyChangedEventArgs e)
{
bool isMouseOver = (bool)e.NewValue;
if (!isMouseOver)
return;
TextBlock textBlock = (TextBlock)sender;
bool needed = textBlock.ActualWidth >
(this.listView.View as GridView).Columns[2].ActualWidth;
((ToolTip)textBlock.ToolTip).Visibility =
needed ? Visibility.Visible : Visibility.Collapsed;
}
Я думаю, вам нужно посмотреть на триггер ControlTemplate, чтобы решить эту проблему. К сожалению, триггеры ControlTemplate всегда сравниваются с определенным значением, не меньше или больше. Это можно сделать, например, если ширина = 100, а не ширина <100.