2013-07-02 4 views
2

내부에 제대로 손질하지 않는 TextBlock의 's를 옵니다의 크기가 작은 becames 때.텍스트는이 코드의 텍스트를 잘라하지 않습니다,리스트 박스

<ListBox ItemsSource="{Binding}"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding}" TextTrimming="CharacterEllipsis"/> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

옵니다HorizontalScrollBar 보여줍니다 - 즉 TextBlock의을위한 공간이 충분히 큰 텍스트 트리밍의 필요가 없습니다. 다음 코드 줄을 사용하여 해결할 수 있습니다.

<ListBox ... 
     ScrollViewer.HorizontalScrollBarVisibility="Disabled" 
     ... /> 

이제 텍스트가 잘립니다. 그러나 전체 텍스트를 다듬을 때까지 ... 만 남았 으면 좋겠습니까? 예를 들어, TextBlock 속성의 MinWidth을 설정했으며 ListBox의 너비가 MinWidth보다 작 으면 HorizontalScrollBar becames를 표시하려고합니다.

나는 SizeChanged 이벤트를 처리하려고 시도했으며 조건에 따라 ScrollViewer.HorizontalScrollBarVisibility 첨부 속성을 설정합니다. 그러나 텍스트 becames는 내가 후자를 Disabled에서 Visible으로 바꿀 때만 다듬어지지 않습니다. 그래서 어떻게 든 점프합니다 .- 잘린 것에서부터 가장 좋은 UI 연습이 아닙니다.

Q : 그렇다면 위에서 설명한 동작을 어떻게 유지할 수 있습니까?

답변

3

WPF의 TextBlock은 실제로 이 아니므로 텍스트를 자르려면이 필요합니다. 충분한 공간이 없을 때 그렇게 할 것입니다. 그러나 ScrollViewer이 스크롤 할 수있게되자 마자 TextBlock은 사용할 수있는 공간이 무한하다고 생각하여 잘라 내지 않습니다.

<DataTemplate> 
    <TextBlock Text="{Binding}" 
       TextTrimming="CharacterEllipsis" 
       MaxWidth="{Binding ActualWidth, RelativeSource={RelativeSource AncestorType={x:Type ListBox}}}"/> 
</DataTemplate> 

이 기본 WPF ListBoxStyle (와 이제까지 약간 너무 큰 것입니다 :

나는이 작업을 수행하는 가장 쉬운 방법은 ActualWidth ListBox의에 TextBlockMaxWidth을 설정하는 것입니다 생각 스크롤 막대가 계속 표시됩니다). 당신이 ListBox.MinWidth을 설정하면, 당신은하지 않습니다, 보너스로

<DataTemplate> 
    <DataTemplate.Resources> 
     <my:FudgeFactorConverter x:Key="fudgeFactorConverter" /> 
    </DataTemplate.Resources> 
    <TextBlock Text="{Binding}" 
       TextTrimming="CharacterEllipsis" 
       MaxWidth="{Binding ActualWidth, RelativeSource={RelativeSource AncestorType={x:Type ListBox}}, Converter={StaticResource fudgeFactorConverter}}"/> 
</DataTemplate> 

다음 MaxWidth를 변환하는 데 사용할 다음

public FudgeFactorConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     if (value == null) return Binding.DoNothing; 

     return (double)value - 8; // you will probably need to tweak this 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return Binding.DoNothing; 
    } 
} 

을 그리고 :이 값에서 약 8을 빼기 위해 사용자 지정 변환기를 작성합니다 수평 스크롤 바를 활성화/비활성화해야합니다.

+0

이것은 내가 원하는 것을 정말로했다! 그러나 나는 ** 8 **이 무엇을 알아낼 수 없는지 알 수 없다. 마진, 경계선, 또는 그 밖의 것이 있습니까? 올바른 해결책의 핵심은 퍼지 (fudge) 용어를 정확하게 계산하는 것입니다. – stukselbax

+0

네, ListBox의 BorderThickness와 ListBoxItem의 Padding의 조합입니다. 'BorderThickness'에 대한 설명의 필요성을 제거 할'ScrollContentPresenter'에 바인드하도록 향상시킬 수 있습니다. –

+0

대단히 고마워! – stukselbax