维护ScrollViewer中其中一个控件的位置

时间:2016-03-03 19:09:19

标签: c# wpf xaml

假设我有这样的XAML代码:

<UserControl x:Class="Sample.MyClass"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="220" d:DesignWidth="750">
    <ScrollViewer Width="730" Height="150" CanContentScroll="True" HorizontalScrollBarVisibility="Visible">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition />
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="50" />
                <ColumnDefinition Width="680" />
            </Grid.ColumnDefinitions>

            <TextBox Width="50" Height="200" Grid.Row="0" Grid.Column="0" />
            <TextBox Width="680" Height="200" Grid.Row="0" Grid.Column="1" />
        </Grid>
    </ScrollViewer>
</UserControl>

现在,当我向右滚动时,我希望第一个TextBox完全可见。换句话说 - 我希望水平滚动(仅水平滚动)仅适用于第二个TextBox,垂直滚动适用于两者。我不能把第一个放在ScrollViewer之外,因为那时垂直滚动对它不起作用。

为您提供更真实的例子: 在VisualStudio中,您可以在文本区域输入代码。在左侧有一个显示行号和代码折叠的面板。如果垂直滚动文本区域,左侧面板也会向下或向上滚动。水平滚动文本区域时,只有文本区域受其影响。

2 个答案:

答案 0 :(得分:1)

您可以尝试修改XAML,如下所示:

<UserControl x:Class="Sample.MyClass"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="220" d:DesignWidth="750">

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="50" />
            <ColumnDefinition Width="680" />
        </Grid.ColumnDefinitions>
        <ScrollViewer Grid.Row="0" Grid.Column="0" 
                  CanContentScroll="True" 
                  VerticalScrollBarVisibility="Visible" 
                  HorizontalAlignment="Stretch">
            <TextBox  />
       </ScrollViewer>
       <ScrollViewer Grid.Row="0" Grid.Column="1"  
                  CanContentScroll="True" 
                  VerticalScrollBarVisibility="Visible" 
                  HorizontalScrollBarVisibility="Visible" 
                  HorizontalAlignment="Stretch" 
                  VerticalAlignment="Stretch">
            <TextBox />
        </ScrollViewer>
    </Grid>
</UserControl>

希望这可能会有所帮助。

答案 1 :(得分:1)

我认为你想要做的是svnc 2滚动查看器,

你可以用伏都教背后的一些代码来做,检查一下

Synchronized scrolling of two ScrollViewers whenever any one is scrolled in wpf