2016-08-04 62 views
1

我与TextBox控制的问题。 请注意ScrollViewer,因为这有所不同。文本框内滚动型施胶用水平滚动

这是我的XAML:

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> 
    <ScrollViewer HorizontalScrollMode="Auto" HorizontalScrollBarVisibility="Auto"> 
     <TextBox HorizontalAlignment="Stretch" 
       VerticalAlignment="Center" 
       Margin="20" 
       Text = "A short text"> 
     </TextBox> 
    </ScrollViewer> 
</Grid> 

它导致这样的:

Result with short text

它看起来像预期和消费它/如果窗口大小很好收缩。 到目前为止这么好,但是如果文本有点长,会发生什么?

出现这种情况:

Result with longer text

TextBox现在长到适合文本内是 一)因为有一个ScrollView,允许水平滚动和 b)导致一个非常丑陋的UI(因为右边距不可见,但滚动条是,等等。)

有谁知道我怎样才能实现从第一个屏幕截图,即使有更长的文本(同时保持ScrollViewer)?

我想过为TextBox设置了最大宽度,但是它阻止了TextBox与不可接受的窗口一起增长。

+1

如果你不想让你的内容滚动,使用ScrollViewer的原因是什么? – Bart

+0

尝试绑定TextBox.Width ScrollViewer.ActualWidth – RTDev

回答

1

我想你可能会感到困惑的ScrollViewerWidthActualWidthScrollableWidth,如果不限制TextBox宽度,ScrollableWidth长大后会与TextBox宽度。限制TextBox的宽度不会解决您的问题。

...右边距是不可见的,但滚动条..

我猜你需要的是这样的:

enter image description here

XAML代码:

<ScrollViewer Margin="20" BorderBrush="Blue" BorderThickness="2" 
       HorizontalScrollMode="Auto" HorizontalScrollBarVisibility="Auto" 
       VerticalScrollBarVisibility="Hidden" VerticalScrollMode="Disabled" Height="45"> 
    <TextBox x:Name="tb" HorizontalAlignment="Stretch" VerticalAlignment="Center" 
      BorderThickness="0"/> 
</ScrollViewer> 

您可以自定义ScrollViewer使其行为像一个TextBox,例如当获得焦点时,将显示Border或其他人。

+0

我认为这是一个非常好的想法 – Felix

0

尝试设置您的ScrollViewer,而不是保证金Padding属性,尝试这种

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">"> 
     <ScrollViewer HorizontalScrollBarVisibility="Auto" Padding="20,0"> 
      <TextBox HorizontalAlignment="Stretch" 
      VerticalAlignment="Center" 
      Margin="20" 
      Text = "A short text"> 
      </TextBox> 
     </ScrollViewer> 
    </Grid> 
1

更改TextBoxMaxWidth财产作为调整窗口的大小会解决你的问题。虽然,我不认为这是一个干净的方式来做到这一点。

int margin = 40; // Set your margin 

    public MainPage() 
    { 
     this.InitializeComponent(); 
     InputTextBox.MaxWidth = Window.Current.Bounds.Width - margin; 
     Window.Current.SizeChanged += Current_SizeChanged; 
    } 

    private void Current_SizeChanged(object sender, Windows.UI.Core.WindowSizeChangedEventArgs e) 
    { 
     var size = e.Size; 
     InputTextBox.MaxWidth = size.Width - margin; 
    }