2012-06-27 33 views
1

我有一个模板列表框,其中包含一个wpf文本框。数据通过ItemsSource提供给列表框。单行wpf文本框水平滚动到结尾

文本框显示文件路径,这些通常很长。我希望在加载文本框时显示文件路径的结尾。

我尝试了DataContextChanged事件和设置HorizontalScrollBarVisibility(使用double.max或获取真正的字符长度)的组合,但没有成功。 DataContextChanged似乎是正确的事件,因为它触发ItemsSource的每个设置。

编辑:

下面是示例代码显示在莱斯特的建议可行,当它不。我试图通过绑定设置文本时使其工作。

<Window x:Class="WpfAppTest.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" 
    Loaded="LoadedHandler"> 
<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto"></RowDefinition> 
     <RowDefinition Height="Auto"></RowDefinition> 
    </Grid.RowDefinitions> 
    <TextBox Name="tbb" Width="50" Height="20" Text="{Binding Path=Str}" 
      IsReadOnly="True" Grid.Column="0" Grid.Row="0" 
      DataContextChanged="ContextChangedHandler"/> 
    <ListBox SelectionMode="Single" x:Name="listBox" Grid.Column="0" Grid.Row="1" 
      VerticalAlignment="Top"> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <TextBox Width="50" Height="20" Text="{Binding Path=Str}" 
         IsReadOnly="True" 
         DataContextChanged="ContextChangedHandler"/> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 
</Grid> 

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 

     var obj = new SomeClass 
         { 
          Str = "qwetyuiuropqo[psdal;dkas;ldamzxn m,cnz128391" 
         }; 
     listBox.ItemsSource = new List<SomeClass> { obj }; 
     tbb.DataContext = obj; 
    } 

    public class SomeClass 
    { 
     public string Str { get; set; } 
    } 

    private void LoadedHandler(object sender, RoutedEventArgs e) 
    { 
     var obj = new SomeClass 
     { 
      Str = "qwetyuiuropqo[psdal;dkas;ldamzxn m,cnz128391" 
     }; 
     listBox.ItemsSource = new List<SomeClass> { obj }; 
     tbb.DataContext = obj; 
    } 

    private void ContextChangedHandler(object sender, DependencyPropertyChangedEventArgs e) 
    { 
     var textBox = sender as TextBox; 
     if (textBox == null) return; 

     textBox.CaretIndex = textBox.Text.Length; 
     var rect = textBox.GetRectFromCharacterIndex(textBox.CaretIndex); 
     textBox.ScrollToHorizontalOffset(rect.Right); 
    } 
} 
+0

你可以发布你试过的代码吗?谢谢。 – Tom

+0

您正在寻找的不仅仅是TextWrapping?你想修剪开始? – Paparazzi

+0

你知道TextBlock有一个TextTrimming属性,但它从右侧修剪。如果你只想要文字结束,你可以有一个只返回文件名而不是完整路径的属性。 – Paparazzi

回答

3

此代码为我工作滚动文本框的末尾(从this question拍摄):

textBox.CaretIndex = textBox.Text.Length; 
var rect = textBox.GetRectFromCharacterIndex(textBox.CaretIndex); 
textBox.ScrollToHorizontalOffset(rect.Right); 
+0

现在,看看我上面的代码片段。如果这三行在Window.Loaded EventHandler中,那么它都可以工作(也不需要使用tb.Focus())!但是,在我的情况下,我需要使用textbox.DataContextChanged处理程序或类似的,而不是Window.Loaded事件。然后它不。 – user1296490

0

解决方案是加载至改变DataContextChanged仅事件使接收文本框的适当通知。