2012-06-27 31 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僅事件使接收文本框的適當通知。