2014-12-23 2 views
0

Я хочу иметь TextBlock в элементе управления ViewboxPanel с TextTrimming, но для этого TextBlock должен иметь ширину. Но как же ширина не имеет ничего общего с показанной шириной, когда в ViewboxPanel?Переполнение WPF TextBlock в окне просмотра

<Window x:Class="SizeTest.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:converters="clr-namespace:SizeTest.Utils.Converters;assembly=SizeTest.Utils" 
     xmlns:controls="clr-namespace:SizeTest.Utils.Controls;assembly=SizeTest.Utils" 
     Title="MainWindow" Height="350" Width="525"> 
    <Window.Resources> 
     <ResourceDictionary> 
      <converters:MarginConverter x:Key="MarginConverter"/> 
     </ResourceDictionary> 
    </Window.Resources> 
    <Grid> 
     <controls:ViewboxPanel HorizontalAlignment="Left"> 
      <controls:ViewboxPanel.Margin> 
       <MultiBinding Converter="{StaticResource MarginConverter}" ConverterParameter="0;40;0;40"> 
        <Binding RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType={x:Type Grid}}" Path="ActualHeight" /> 
        <Binding RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType={x:Type Grid}}" Path="ActualWidth" /> 
       </MultiBinding> 
      </controls:ViewboxPanel.Margin> 
      <TextBlock Text="fgghgfhdfgfgsdfdsfdsfdsfsdf" Width="130" TextTrimming="CharacterEllipsis" /> 
     </controls:ViewboxPanel> 

    </Grid> 
</Window> 

Контроль:

public class ViewboxPanel : Panel 
     { 
      private double scale; 

      protected override Size MeasureOverride(Size availableSize) 
      { 
       double height = 0; 
       Size unlimitedSize = new Size(double.PositiveInfinity, double.PositiveInfinity); 
       foreach (UIElement child in Children) 
       { 
        child.Measure(unlimitedSize); 
        height += child.DesiredSize.Height; 
       } 
       scale = availableSize.Height/height; 

       return availableSize; 
      } 

      protected override Size ArrangeOverride(Size finalSize) 
      { 
       Transform scaleTransform = new ScaleTransform(scale, scale); 
       double height = 0; 
       foreach (UIElement child in Children) 
       { 
        child.RenderTransform = scaleTransform; 
        child.Arrange(new Rect(new Point(0, scale * height), new Size(finalSize.Width/scale, child.DesiredSize.Height))); 
        height += child.DesiredSize.Height; 
       } 

       return finalSize; 
      } 
     } 

ViewboxPanel контролируется краем и процент. Но почему ширина 130 TextBlock соответствует ширине ViewboxPanel, которая равна 525 (по ширине окна)?

Я хочу, чтобы иметь возможность изменять размер окна, а ширина текстового блока должна следовать, чтобы он отображал/скрывал текст, обрезая его. Таким образом, ширина TextBlock следует связать с шириной сетки ИТС, например:

Width="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Grid}}, Path=ActualWidth}" 

Но я не могу понять, почему 525 не будет правильно !?

+0

Какова цель ViewBox? Можете ли вы заменить его какой-либо панелью или просто добавить Textblock прямо под Grid? – ShayD

+0

Целью является контроль размера текста. В моем конечном приложении viewbox контролируется через его поля и устанавливается в процентах. –

+0

ViewBox, безусловно, не то, что вам нужно здесь. Подумайте об использовании какой-либо панели или границы. – ShayD

ответ

1

Возможно, вы неправильно поняли цель ViewBox control. От связанной страницы на сайте MSDN:

Определяет содержание декоратор, который может растягиваться и масштабироваться одного ребенка для заполнения доступного пространства.

Для того, чтобы получить желаемый эффект изменения, что указывает на характер начинается с многоточием, вам необходимо изменить Width в TextBlock, не ViewBox.

+0

Я не изменяю ширину окна просмотра, только его высоту, чтобы контролировать размер текста. –

+0

* вам нужно изменить ширину TextBlock * – Sheridan

+0

Да .. это не проблема. Проблема в том, почему 83 пикселя в ширине показывают на 100% ширину окна/сетки? –

0

В вашей ситуации viewbox пытается масштабировать дочерний элемент внутри него, и поэтому, если вы установите ширину текстового блока на 83, viewbox mantain пропорции элемента управления, масштабирующего его в соответствии с фактической шириной и высотой родительский контейнер. Он никогда не будет урезать ваш текстовый блок, потому что он будет увеличивать его и выворачивать, чтобы поддерживать пропорции текстового блока, и поэтому, если в окне недостаточно места для отображения содержимого текстового блока, окно просмотра будет уменьшать его и наоборот.

Я думаю, что если вы хотите использовать ViewBox обрезки содержание TextBlock вы должны попытаться связать ширину texblock по ширине окна

<Window x:Class="SizeTest.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525" Name="WinName"> 
<Grid> 
    <Viewbox Height="100" HorizontalAlignment="Left"> 
     <TextBlock Text="fgghgfhdfgfgdsfdsf" Width="{Binding Path=ActualWidth, ElementName=WinName}" TextTrimming="CharacterEllipsis" /> 
    </Viewbox> 
</Grid> 

, но в этом в случае, если viewbox не вносит никаких изменений в ваш текстовый блок: он не будет масштабироваться.

Если он может удовлетворить, вы можете попытаться установить Stretch="UniformToFill", но в этом случае он не обрезает ваш текст.

Но я не думаю, что это не лучший подход, вы, должно быть, неправильно поняли цель окна просмотра.

Смежные вопросы