2012-11-02 7 views
0

GridSplitter를 사용하여 크기가 큰 패널에 TextBox 컨트롤을 배치하려고합니다.Non-Expanding TextBox/ScrollViewer

내가 처음 경험 한 문제는 entred 된 텍스트가 길어지면서 TextBox의 크기가 자동으로 조정된다는 점이었습니다. 이 사이트에서 TextBox를 테두리로 묶은 다음 TextBox의 너비를 테두리의 너비 (아래 XAML에 표시됨)로 설정하는 솔루션을 발견했습니다. 이것이 효과가있는 것으로 보입니다. 나는 그것이 내가 도움을 구하는 이슈의 원인 인 경우 이것을 언급한다.

현재 문제는 TextBox의 크기가 조정되지만 패널의 크기를 줄이면 바로 ScrollViewer가 시작된다는 것입니다. ScrollViewer는 TextBox의 크기가 최소 너비 (이전이 아닌)로 내려갈 때 시작됩니다.

현재 사용중인 전체 XAML은 아래에 있습니다.

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Class="NonExpandingTextBoxDemo.MainWindow" Height="350" Title="MainWindow" Width="525"> 
    <Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="Auto" /> 
     <ColumnDefinition Width="Auto" /> 
     <ColumnDefinition Width="*" /> 
    </Grid.ColumnDefinitions> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="*" /> 
    </Grid.RowDefinitions> 
    <ScrollViewer Grid.Column="0" Grid.Row="0" HorizontalAlignment="Stretch" HorizontalScrollBarVisibility="Auto" VerticalAlignment="Stretch" VerticalScrollBarVisibility="Auto"> 
     <Border HorizontalAlignment="Stretch" Margin="20, 20, 20, 20" MinWidth="100" VerticalAlignment="Center"> 
     <TextBox Width="{Binding Mode=OneWay, Path=ActualWidth, RelativeSource={RelativeSource AncestorType={x:Type Border}, Mode=FindAncestor}}" /> 
     </Border> 
    </ScrollViewer> 
    <GridSplitter Grid.Column="1" Grid.Row="0" ResizeBehavior="PreviousAndNext" VerticalAlignment="Stretch" Width="3" /> 
    <TextBlock Grid.Column="2" Grid.Row="0" HorizontalAlignment="Center" Text="Right Panel" VerticalAlignment="Center" /> 
    </Grid> 
</Window> 

질문은 무엇입니까? 몇 가지 시도했지만 아무것도 작동하는 것 같습니다.

이 문제에 대한 안내에 미리 감사드립니다.

답변

0

문제는 ScrollViewer입니다. 자세한 내용은 ScrollViewer가 작아지면 크기를 조정하도록 구성되어 있지 않습니다. 따라서 자식 요소가 성장하지만 축소되지 않는 것을 볼 수 있습니다.

왜 ScrollViewer가 필요합니까?

<Window x:Class="TextWrappingAtParentSize.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"> 
    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Name="FirstCol" MinWidth="100" Width="Auto" /> 
      <ColumnDefinition Width="Auto" /> 
      <ColumnDefinition Width="*" /> 
     </Grid.ColumnDefinitions> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="*" /> 
     </Grid.RowDefinitions> 
      <Border VerticalAlignment="Center" Margin="20, 20, 20, 20" > 
       <TextBox Width="{Binding Mode=OneWay, Path=ActualWidth, RelativeSource={RelativeSource AncestorType={x:Type Border}, Mode=FindAncestor}}" TextWrapping="Wrap"/> 
      </Border> 
     <GridSplitter Grid.Column="1" Grid.Row="0" ResizeBehavior="PreviousAndCurrent" VerticalAlignment="Stretch" Width="3" /> 
     <TextBlock Grid.Column="2" Grid.Row="0" HorizontalAlignment="Center" Text="Right Panel" VerticalAlignment="Center" /> 
    </Grid> 
</Window> 

열에 MinWidth를 입력하면 스크롤 할 필요가 없습니다. 그러나 이것은 샘플 일 뿐이며 스크롤해야 할 다른 필요성이 있음을 알고 있습니다.

나는 계속해서 스크롤링 솔루션을 찾을 수 있습니다. 알려줘.

+0

설명해 주셔서 감사합니다. 내 생각 프로세스는 TextBox 요소의 최소 너비 (또는 ScrollViewer에있는 내용)가 최소 너비 200을 갖지만 사용자가 패널의 너비를 100으로 지정하는 것과 같은 것입니다. 이 경우 전체 영역을 표시 할 수 있기를 원합니다 (스크롤을 통해 수행 할 수도 있음). 나는 최소한 패널의 최소 너비를 내용의 최소 너비로 설정할 수 있다고 생각한다. 그러나 이것이 결국 나타날 모양은 상당히 진행되고 있으므로 공간을 최대한 활용하고 싶습니다. –

0

내 시나리오는 유사합니다. 나는 TexBlock이 컬럼으로 확장하고 텍스트를 감쌀 필요가있는 격자를 래핑하는 scrollviewer를 가졌다. 변환기를 만들어이 작업을 수행 할 수있었습니다.

public class ValueConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     int width; 

     if (int.TryParse(value.ToString(), out width) && width > 0) 
     { 
      return width - int.Parse(parameter.ToString()); 
     } 

     return 0; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

포함하는 ScrollViewer의 이름은 "scrollViewerDetails"이므로 변환기의 너비가 전달됩니다. ConverterParamter (170)는 전체 너비에서 뺄 필요가있는 첫 번째 열의 너비입니다.

<TextBox Grid.Column="1" Grid.Row="4" HorizontalAlignment="Stretch" Width="{Binding ElementName=scrollViewerDetails, Path=ActualWidth, Converter={StaticResource ValueConverter}, ConverterParameter=170}" />