2012-08-10 2 views

답변

3

나는 당신이 당신의 설정에서이 생각 나는 다시 한 :

<StackPanel> 
    <ScrollViewer Height="50" x:Name="_scroll"> 
     <TextBox x:Name="_text" Width="50" Text="Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua." TextWrapping="Wrap"/> 
    </ScrollViewer> 
    <Button Click="Button_Click" Content="Add Text"/> 
</StackPanel> 

나는 당신이 버튼 내 설정에서이 텍스트 상자를 편집 할 몇 가지 이벤트가 있다고 가정합니다. 클릭 핸들러 :

private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     var shouldScroll = _scroll.VerticalOffset == _scroll.ScrollableHeight; 

     _text.Text += "AAA "; 

     if (shouldScroll) 
     { 
      _scroll.ScrollToEnd(); 
     } 
    } 

스크롤 막대가 아래쪽에있는 경우에만 텍스트 편집 후 자동 스크롤됩니다.

편집

당신은 행동 사용할 수 있습니다 청소기 솔루션의 경우 :

public class AutoScrollingBehavior : Behavior<ScrollViewer> 
{ 
    public object UpdateTrigger 
    { 
     get { return (object)GetValue(UpdateTriggerProperty); } 
     set { SetValue(UpdateTriggerProperty, value); } 
    } 

    public static readonly DependencyProperty UpdateTriggerProperty = 
     DependencyProperty.Register("UpdateTrigger", typeof(object), typeof(AutoScrollingBehavior), new UIPropertyMetadata(Update)); 

    private bool IsScrolledDown 
    { 
     get { return (bool)GetValue(IsScrolledDownProperty); } 
     set { SetValue(IsScrolledDownProperty, value); } 
    } 

    public static readonly DependencyProperty IsScrolledDownProperty = 
     DependencyProperty.Register("IsScrolledDown", typeof(bool), typeof(AutoScrollingBehavior), new UIPropertyMetadata(false)); 

    private static void Update(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     if ((bool)d.GetValue(IsScrolledDownProperty)) 
     { 
      var scroll = ((AutoScrollingBehavior)d).AssociatedObject; 
      scroll.ScrollToEnd(); 
     } 
    } 

    protected override void OnAttached() 
    { 
     AssociatedObject.Loaded += new RoutedEventHandler(AssociatedObject_Loaded); 
     AssociatedObject.ScrollChanged += new ScrollChangedEventHandler(AssociatedObject_ScrollChanged); 
    } 

    private void AssociatedObject_ScrollChanged(object sender, ScrollChangedEventArgs e) 
    { 
     IsScrolledDown = AssociatedObject.VerticalOffset == AssociatedObject.ScrollableHeight; 
    } 

    private void AssociatedObject_Loaded(object sender, RoutedEventArgs e) 
    { 
     IsScrolledDown = AssociatedObject.VerticalOffset == AssociatedObject.ScrollableHeight; 
    } 
} 

및 XAML :

public class AutoScrollTextBox : TextBox 
{ 
    ScrollViewer sv; 
    public override void OnApplyTemplate() 
    { 
     base.OnApplyTemplate(); 
     if (Template != null) 
     { 
      sv = (ScrollViewer)Template.FindName("PART_ContentHost", this); 
     } 
    } 

    protected override void OnTextChanged(TextChangedEventArgs e) 
    { 
     base.OnTextChanged(e); 
     if (sv != null && sv.ScrollableHeight == sv.VerticalOffset) 
     { 
      this.ScrollToEnd(); 
     } 
    } 
} 
:
<StackPanel> 
    <ScrollViewer Height="50" > 
     <e:Interaction.Behaviors> 
      <local:AutoScrollingBehavior UpdateTrigger="{Binding ElementName=_text,Path=Text}" /> 
     </e:Interaction.Behaviors> 
     <TextBox x:Name="_text" Width="50" Text="Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua." TextWrapping="Wrap"/> 
</ScrollViewer> 
    <Button Click="Button_Click" Content="Add Text"/> 
</StackPanel> 
+0

나는 TextBox에 ViewModel의 일부 속성에 대한 바인딩이 있으므로 코드 숨김을 피하고자합니다. –

+0

업데이트를 참조하십시오. 'UpdateTrigger'의 경우 여러분의 모델에서 직접 바인딩을 피하기 위해 프라퍼티 폼을 바인딩 할 수 있습니다. – Rafal

+0

방금 ​​작성한 AutoScrollingBehavior 클래스를 사용했는데 잘 작동합니다! snippit 주셔서 감사합니다. – JonD

0

내가이 일을 어떻게 든 해키 방법을 찾았을

하지만 이것은 sto TextBox-Template에서 ScrollViewer의 이름이 변경되면 작동합니다.

관련 문제