스크롤 막대를 움직일 때 WPF-TextBox 자동 스크롤을 허용하지만 해당 동작을 중지 할 수 있습니까? 사용자가 스크롤하여 텍스트 상자를 끝내면 TextBox가 자동으로 다시 스크롤되어 텍스트 변경이 끝납니다.사용자가 스크롤 막대를 이동하지 않은 경우 텍스트 상자 자동 스크롤
textBox1.ScrollToEnd();
사용자가 ScrollBar를 이동하지 않는 한 작동합니다.
스크롤 막대를 움직일 때 WPF-TextBox 자동 스크롤을 허용하지만 해당 동작을 중지 할 수 있습니까? 사용자가 스크롤하여 텍스트 상자를 끝내면 TextBox가 자동으로 다시 스크롤되어 텍스트 변경이 끝납니다.사용자가 스크롤 막대를 이동하지 않은 경우 텍스트 상자 자동 스크롤
textBox1.ScrollToEnd();
사용자가 ScrollBar를 이동하지 않는 한 작동합니다.
나는 당신이 당신의 설정에서이 생각 나는 다시 한 :
<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>
하지만 이것은 sto TextBox-Template에서 ScrollViewer의 이름이 변경되면 작동합니다.
나는 TextBox에 ViewModel의 일부 속성에 대한 바인딩이 있으므로 코드 숨김을 피하고자합니다. –
업데이트를 참조하십시오. 'UpdateTrigger'의 경우 여러분의 모델에서 직접 바인딩을 피하기 위해 프라퍼티 폼을 바인딩 할 수 있습니다. – Rafal
방금 작성한 AutoScrollingBehavior 클래스를 사용했는데 잘 작동합니다! snippit 주셔서 감사합니다. – JonD