В последнее время я не очень много работал с WPF, поэтому не уверен, что это именно то, что вы ищете, но посмотрите эту статью: Настройка «привлекательных» элементов управления WPF - Take 2 . Это немного сложно, но, похоже, отвечает на тот же вопрос, который вы задаете. ОБНОВЛЕНИЕ: веб-сайт вроде исчез, но вы можете найти статью в архиве .
Я имел маленькую проблему с помощью ответа Alex и должен был изменить мою логику немного, чтобы разъясниться, обрезался ли текст в текстовом блоке.
var formattedText = new FormattedText(
Text, System.Threading.Thread.CurrentThread.CurrentCulture, FlowDirection, typeface, FontSize,
Foreground, VisualTreeHelper.GetDpi( this ).PixelsPerDip ) { MaxTextWidth = ActualWidth };
//Measure(new Size(Double.PositiveInfinity, Double.PositiveInfinity));
return ( Math.Floor(formattedText.Height ) > ActualHeight || Math.Floor( formattedText.MinWidth ) > ActualWidth;
Это работает отлично на меня.
я определил пользовательский элемент управления, который был TextBlock с включенным замещающим знаком. Тогда я определил 2 функции для OnMouseUp и OnMouseDown, так, чтобы, когда пользователь нажал на textblock, который имел переполнение, это отобразит подсказку с полной стоимостью.
Это - функция OnMouseDown
private void TextBlockWithToolTipView_OnMouseDown(
object sender,
MouseButtonEventArgs e )
{
var typeface = new Typeface(
FontFamily,
FontStyle,
FontWeight,
FontStretch);
var formattedText = new FormattedText(
Text, System.Threading.Thread.CurrentThread.CurrentCulture, FlowDirection, typeface, FontSize,
Foreground, VisualTreeHelper.GetDpi( this ).PixelsPerDip ) { MaxTextWidth = ActualWidth };
if (Math.Floor(formattedText.Height) > ActualHeight || Math.Floor(formattedText.MinWidth) > ActualWidth )
{
if( ToolTip is ToolTip tt )
{
{
if( tt.PlacementTarget == null )
{
tt.PlacementTarget = this;
}
tt.IsOpen = true;
e.Handled = true;
}
}
}
}
, И это было битом Xaml
<TextBlock
ToolTipService.IsEnabled="True"
MouseDown="TextBlockWithToolTipView_OnMouseDown"
MouseLeave="TextBlockWithToolTipView_OnMouseLeave"
TextTrimming="CharacterEllipsis"
TextWrapping="WrapWithOverflow">
<TextBlock.ToolTip>
<ToolTip
DataContext="{Binding Path=PlacementTarget, RelativeSource={x:Static RelativeSource.Self}}">
<TextBlock Text="{Binding Path=Text, Mode=OneWay }"
TextWrapping="Wrap"/>
</ToolTip>
</TextBlock.ToolTip>
</TextBlock>