2013-10-12 4 views
0

Я несколько раз сталкивался с этой проблемой и еще не нашел простого решения. Когда TextBlockTextWrapping="Wrap") встроен в другой элемент, который не указывает его ширину, размер TextBlock расширяется настолько, насколько позволяет его родительский элемент, вместо того чтобы сначала пытаться обернуть его текст. Например, я сейчас работаю над TextBlockValidationTemplate. Вот как в данный момент шаблон обрабатывает текст длиннее, чем ширина TextBox:Предотвращение обертывания TextBlock от воздействия макета

Current validation template

, который, очевидно, не является оптимальным. Вот как я хотел бы, чтобы она появилась:

Desired validation template

Вот XAML для ControlTemplate, который производит первый макет:

<ControlTemplate> 
    <DockPanel LastChildFill="True"> 
    <Border DockPanel.Dock="Top" BorderBrush="Red" BorderThickness="1"> 
     <DockPanel> 
     <AdornedElementPlaceholder x:Name="TargetTextBox" /> 
     <Grid x:Name="WarningBoxContainer" Background="Red" Width="{Binding ElementName=TargetTextBox, Path=ActualHeight}" Height="{Binding RelativeSource={RelativeSource Self}, Path=Width}"> 
      <Path Margin="5" Stretch="Fill" Fill="#FFFFFFFF" Data="F1 M 26.9166,22.1667L 37.9999,33.25L 49.0832,22.1668L 53.8332,26.9168L 42.7499,38L 53.8332,49.0834L 49.0833,53.8334L 37.9999,42.75L 26.9166,53.8334L 22.1666,49.0833L 33.25,38L 22.1667,26.9167L 26.9166,22.1667 Z "/> 
     </Grid> 
     </DockPanel> 
    </Border> 
    <Border DockPanel.Dock="Top" Margin="0,2,0,0"> 
     <TextBlock Text="Something very terrible has happened" TextWrapping="Wrap"/> 
    </Border> 
    </DockPanel> 
</ControlTemplate> 

Кто-нибудь знает, как сделать TextBlock обертку, прежде чем пытаться расширить?

ответ

0

Конечно, минут после публикации, я нахожу ответ.

У меня возникла идея использовать привязку для обеспечения ширины TextBlock от this.

В моем случае, связывание ширину TextBlock «сек к ActualWidth от AdornedElementPlaceholder элемента сделал это:

<ControlTemplate> 
    <DockPanel LastChildFill="True"> 
    <Border DockPanel.Dock="Top" BorderBrush="Red" BorderThickness="1"> 
     <DockPanel> 
     <AdornedElementPlaceholder x:Name="TargetTextBox" /> 
     <Grid x:Name="WarningBoxContainer" Background="Red" Width="{Binding ElementName=TargetTextBox, Path=ActualHeight}" Height="{Binding RelativeSource={RelativeSource Self}, Path=Width}"> 
      <Path Margin="5" Stretch="Fill" Fill="#FFFFFFFF" Data="F1 M 26.9166,22.1667L 37.9999,33.25L 49.0832,22.1668L 53.8332,26.9168L 42.7499,38L 53.8332,49.0834L 49.0833,53.8334L 37.9999,42.75L 26.9166,53.8334L 22.1666,49.0833L 33.25,38L 22.1667,26.9167L 26.9166,22.1667 Z "/> 
     </Grid> 
     </DockPanel> 
    </Border> 
    <Border DockPanel.Dock="Top" Margin="0,2,0,0"> 
     <TextBlock Text="Something very terrible has happened" TextWrapping="Wrap" HorizontalAlignment="Left" Width="{Binding ElementName=TargetTextBox, Path=ActualWidth}" Height="{Binding RelativeSource={RelativeSource Self}, Path=Width}"/> 
    </Border> 
    </DockPanel> 
</ControlTemplate> 

Конечный продукт:

enter image description here

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