рдпрджрд┐ рдЖрдкрдиреЗ рд╡рд┐рдВрдбреЛрдЬ рдлреЛрди 7 рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд▓рд┐рдП рд╣реИрдВ, рддреЛ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреБрдЫ рдирд┐рдпрдВрддреНрд░рдгреЛрдВ рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдкрд░ рдзреНрдпрд╛рди рджреЗ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рд╣рдм рдЯрд╛рдЗрд▓, рдПрдХ рд╕рдореВрд╣реАрдХреГрдд рд╕реВрдЪреА рдпрд╛ рд╕рдВрджреЗрд╢реЛрдВ рдХреА рд╕реВрдЪреАред рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдХреЛ рд╡рд┐рдВрдбреЛрдЬ рдлреЛрди рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд▓рд┐рдП рд╕рд┐рд▓реНрд╡рд░рд▓рд╛рдЗрдЯ рдЯреВрд▓рдХрд┐рдЯ рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ рдЬрдм рд╣рдореЗрдВ рдорд╛рдирдХ рд╕рдВрджреЗрд╢ рд╣рдм рдХреЗ рд╕рдорд╛рди рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдореБрдЦреНрдп рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рдорд╛рдирдХ рд▓рд┐рд╕реНрдмрд╛рдХреНрд╕ рдореЗрдВ, рдЖрдЗрдЯрдо рдХреЛ рдКрдкрд░ рд╕реЗ рдиреАрдЪреЗ рддрдХ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдПрдХ рд╕рдВрджреЗрд╢ рд╣рдм рдореЗрдВ, рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрддред

рдореИрдВ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдПрдХ рд╕рдорд╛рдзрд╛рди рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдорд╛рдирдХ ListBox рдирд┐рдпрдВрддреНрд░рдг, System.Windows.Interaction рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ Blend SDK рд╕реЗ рдФрд░ рдХреБрдЫ рдЬреНрдЮрд╛рди рджреГрд╢реНрдп рдШрдЯрдХреЛрдВ рдХреЗ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдЪрд╛рд╣рд┐рдПред
So. рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдХрд╣рд╛ рдерд╛, рдорд╛рдирдХ ListBox рдЕрдкрдиреЗ рдЖрдЗрдЯрдо рдХреЛ рд╡рд░реНрдЪреБрдЕрд▓рд╛рдЗрдЬрд╝рд┐рдВрдЧрд╕реНрдЯреИрдХрдкреИрдирд▓ рдореЗрдВ рдКрдкрд░ рд╕реЗ рдиреАрдЪреЗ рддрдХ рд░рдЦрддрд╛ рд╣реИред рдЕрдкрдиреЗ VirtualizingStackPanel рдХреЛ рд▓рд┐рдЦрдирд╛, рдЬреЛ рдиреАрдЪреЗ рд╕реЗ рдЖрдЗрдЯрдо рдХреЛ рдЬрдЧрд╣ рджреЗрдЧрд╛, рдмрд╣реБрдд рд╕рдордп рд▓рдЧ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдорд╛рдирдХ VirtualizingStackPanel рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡рд░реНрдЪреБрдЕрд▓рд╛рдЗрдЬреЗрд╢рди рддрд░реНрдХ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рднрд╛рд░реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдореЗрдореЛрд░реА рдХреА рдЦрдкрдд рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИред рд╣рдореЗрдВ рдмрд╕ рдЗрддрдирд╛ рдХрд░рдирд╛ рд╣реИ рдХрд┐ рд▓рд┐рд╕реНрдЯрдмреЙрдХреНрд╕ рдХреЛ рдЙрд▓реНрдЯрд╛ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдП рддрд╛рдХрд┐ рдирдП рдЖрдЗрдЯрдо рдХреЛ рдиреАрдЪреЗ рд░рдЦрд╛ рдЬрд╛рдПред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, ScaleTransform рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
<ListBox> <ListBox.RenderTransform> <ScaleTransform ScaleX="1" ScaleY="-1"> </ListBox.RenderTransform> </ListBox>
рдЕрдм рд╣рдорд╛рд░рд╛ рд▓рд┐рд╕реНрдЯрдмреЙрдХреНрд╕ рдЙрд▓реНрдЯрд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдмрдЪрд╛ рд╣реБрдЖ рд╣реИред рдЗрд╕реЗ рдЕрдкрдиреЗ рд╕реНрдерд╛рди рдкрд░ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдХреЗрдВрджреНрд░ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдордзреНрдп рд▓рдВрдмрд╡рдд рд╣реИ, рдЕрд░реНрдерд╛рдд:
_scaleTransform.CenterY = ListBox.ActualHeight / 2;
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рджреЗрдЦрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╣рдорд╛рд░реЗ рд▓рд┐рд╕реНрдЯрдмреЙрдХреНрд╕ рдХреЗ рддрддреНрд╡ рднреА рдЙрд▓рдЯреЗ рд╣реИрдВред рдЙрдиреНрд╣реЗрдВ рдЙрдирдХреА рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╡рд╛рдкрд╕ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЙрд╕реА рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдордиреЗ рдкреВрд░реА рд╕реВрдЪреА рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдерд╛ред
MVVM рдХреЗ рдкреНрд░рд╢рдВрд╕рдХ .xaml.cs рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВ рдЖрдорддреМрд░ рдкрд░ System.Windows.Interaction рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рд╕рднреА рдЕрддрд┐рд░рд┐рдХреНрдд рддрд░реНрдХ рд▓рд┐рдЦрддрд╛ рд╣реВрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреЛрдб рдХреЗ рд╕рд╛рде рдПрдХ рдорд┐рд░рд░рдмреАрдпрд░ рдХреНрд▓рд╛рд╕ рдмрдирд╛рдПрдВ:
public class MirrorBehavior : Behavior<Control> { private readonly ScaleTransform _transform = new ScaleTransform(); public MirrorBehavior() { _transform.ScaleX = 1; _transform.ScaleY = -1; } protected override void OnAttached() { UpdateCenter(); AssociatedObject.SizeChanged += AssociatedObject_SizeChanged; AssociatedObject.RenderTransform = _transform; } protected override void OnDetaching() { AssociatedObject.RenderTransform = null; AssociatedObject.SizeChanged -= AssociatedObject_SizeChanged; ResetCenter(); } private void AssociatedObject_SizeChanged(object sender, SizeChangedEventArgs e) { UpdateCenter(); } private void UpdateCenter() { _transform.CenterY = AssociatedObject.ActualHeight / 2; } private void ResetCenter() { _transform.CenterY = 0; } }
рдпрд╣ рдХреЗрд╡рд▓ рд╣рдорд╛рд░реЗ рдирд┐рдпрдВрддреНрд░рдгреЛрдВ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ:
<ListBox ItemsSource="{Binding Messages}"> <i:Interaction.Behaviors> <Interactivity:MirrorBehavior /> </i:Interaction.Behaviors> <ListBox.ItemTemplate> <DataTemplate> <ContentControl HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch" ContentTemplate="{StaticResource MessageTemplate}" Content="{Binding}"> <i:Interaction.Behaviors> <Interactivity:MirrorBehavior /> </i:Interaction.Behaviors> </ContentControl> </DataTemplate> </ListBox.ItemTemplate> </ListBox>
рдпрд╣ рд╕рдорд╛рдзрд╛рди рдЕрдЪреНрдЫрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдорд╛рдирдХ рд╢реИрд▓рд┐рдпреЛрдВ рдФрд░ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╡рд░реНрдЪреБрдЕрд▓рд╛рдЗрдЬреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред