2011-10-19 18 views
10

Próbuję dowiedzieć się, jak uzyskać pole tekstowe, aby zawinąć jego zawartość, jednak sytuacja nie jest taka sama, jak w typowym scenariuszu "nie zawija się". Moje pole tekstowe jest zawarty wewnątrz DataTemplate, który jest używany wewnątrz instancji Telerik RadTabControl (stosując ContentTemplatePresenter celu określenia, które zobaczyć, aby wyświetlić) i XAML dla DataTemplate wygląda następująco:WPF TextBox Owijanie

<DataTemplate x:Key="NotesTemplate"> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto" /> 
      <RowDefinition Height="*" /> 
     </Grid.RowDefinitions> 
     <TextBlock Text="Use the box below to record any general notes associated with this item." Style="{StaticResource Default}" /> 
     <TextBox TextWrapping="Wrap" AcceptsReturn="True" VerticalScrollBarVisibility="Auto" GridRow="1" Margin="20" Text="{Binding Notes, UpdateSourceTrigger=PropertyChanged}" /> 
    </Grid> 
</DataTemplate> 

Dlatego mówię, że nie robi” t objęte są normalnym scenariuszem "nie pakuje się" jest używany do zawijania, dopóki nie zmieniłem widoku, aby zmienić rozmiar na wszystko, aby obsługiwać różne rozmiary ekranu, na których aplikacja będzie działać. Kiedy to zrobiłem, TextBox przestał owijać się, ponieważ (prawdopodobnie) gdy użytkownik pisze coś, co TextBox mówi "Potrzebuję więcej miejsca", więc rodzic zobowiązuje się, a pudełko wychodzi na prawo w nieskończoność (chociaż widok dostaje paski przewijania). Próbowałem ustawić MaxWidth za pomocą Binding/RelativeSource, ale ponieważ rodzic jest specjalnie zaprojektowany do wzrostu, to podejście nie zadziała. Muszę się wydarzyć, że pole powinno być szerokością jego "zawierającego rodziców" VisibleWidth. To znaczy, jeśli samo okno ma rozmiar 1024x768, wartość MaxWidth w TextBoxie powinna wynosić 1024, a dowolny tekst będzie się automatycznie owijał, ale jeśli okno powiększy się do 1280x1024, pole powinno wynosić 1280, a tekst zawija się odpowiednio. Próbowałem ten scenariusz z tego wyrażenia wiążącej, ale bez powodzenia:

MaxWidth="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}, Path=ActualWidth}" 

rozmiar okna się nie rozwija się tak, jeśli mogę dostać okna na szerokość (minus pewną kwotę na pokrycie szerokości zakładek, które są część TabControl) Wierzę, że to zadziała.

Wszelkie pomysły?

+0

Skończyło się na znalezieniu najlepszego wyniku za pomocą innego pytania SO: http://stackoverflow.com/questions/386039/wpf-textbox-and-scroll-behavior. – RubyHaus

Odpowiedz

13

choć widok dostaje przewijania

Wyłącz poziomą Scrollview, więc będzie on zmuszony do zawijania. Możesz spróbować wyłączyć to samo w sobie lub na opakowaniu Grid.

<DataTemplate x:Key="NotesTemplate"> 
    <Grid ScrollViewer.HorizontalScrollBarVisibility="Disabled"> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto" /> 
      <RowDefinition Height="*" /> 
     </Grid.RowDefinitions> 
     <TextBlock Text="Use the box below to record any general notes associated with this item." Style="{StaticResource Default}" /> 
     <TextBox TextWrapping="Wrap" AcceptsReturn="True" VerticalScrollBarVisibility="Auto" Grid.Row="1" Margin="20" Text="{Binding Notes, UpdateSourceTrigger=PropertyChanged}" /> 
    </Grid> 
</DataTemplate> 
+0

To nie działało, ale to łącze SO dostało mi 99% drogi: http://stackoverflow.com/questions/386039/wpf-textbox-and-scroll-behavior. Jedyna rzecz, o której nie wiem, to to, że jeśli zmieniają rozmiar okna z powrotem na mniejszą rozdzielczość, pudełko zachowuje oryginalną szerokość, ale nie jestem pewien, czy to ma dla mnie znaczenie, czy nie, i pochylam się w stronę nie. – RubyHaus

+0

@digitall: Po prostu uruchomiłem kod i działało dobrze (tylko siatka). Może inne elementy sterujące owijaniem je zepsują. – MichaelS

+0

W siatce z 8 kolumnami (z jedną kolumną ustawioną na auto), z polem tekstowym o rozpiętości kolumn = "8", zawijanie nie działa, pole tekstowe automatycznie zwiększa rozmiar; ( – lunair