WPF: ScrollBar не активируется в ScrollViewer - PullRequest
1 голос
/ 08 апреля 2011

WPF
Почему полоса прокрутки не активируется в ScrollViewer при увеличении масштаба?

<Window x:Class="WpfApplication4.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="356" Width="804">
    <Grid>
        <ScrollViewer
            PreviewMouseWheel="ScrollViewer_PreviewMouseWheel" 
            VerticalScrollBarVisibility="Visible"
            HorizontalScrollBarVisibility="Visible">
            <Canvas>
                <Canvas.LayoutTransform>
                    <TransformGroup>
                        <ScaleTransform x:Name="scaleTransform"/>
                    </TransformGroup>
                </Canvas.LayoutTransform>
                <TextBlock Canvas.Left="34" Canvas.Top="47" Name="textBlock1" Text="TK QSDFWPO Aàâéèêëîïôùûüÿçæœ; BLA BLA BLA...... " />
                <TextBlock Canvas.Left="310" Canvas.Top="46" Name="textBlock4" Text="TK QSDFWPO Aàâéèêëîïôùûüÿçæœ; BLA BLA BLA...... " />
                <TextBlock Canvas.Left="188" Canvas.Top="157" Name="textBlock11" Text="TK QSDFWPO Aàâéèêëîïôùûüÿçæœ; BLA BLA BLA...... " />
            </Canvas>
        </ScrollViewer>
    </Grid>
</Window>

CS:

private void ScrollViewer_PreviewMouseWheel(object sender, MouseWheelEventArgs e)
{
    if (e.Delta > 0)
        scaleTransform.ScaleY =
            scaleTransform.ScaleX += 0.1;
    else
        scaleTransform.ScaleY =
            scaleTransform.ScaleX -= 0.1;
}

Почему полоса прокруткине активируется при увеличении?

Ответы [ 3 ]

1 голос
/ 08 апреля 2011

вам нужно установить для него ширину и высоту (это не будет работать в авто)

1 голос
/ 08 апреля 2011

Canvas не изменяет размер содержимого.Вы должны использовать другую панель.Сетка, например:

<ScrollViewer
    PreviewMouseWheel="ScrollViewer_PreviewMouseWheel" 
    VerticalScrollBarVisibility="Visible"
    HorizontalScrollBarVisibility="Visible">
    <Grid>
        <Grid.LayoutTransform>
            <TransformGroup>
                <ScaleTransform x:Name="scaleTransform"/>
            </TransformGroup>
        </Grid.LayoutTransform>
        <TextBlock Margin="34,47" Name="textBlock1" Text="TK QSDFWPO Aàâéèêëîïôùûüÿçæœ; BLA BLA BLA...... " />
        <TextBlock Margin="310,46" Name="textBlock4" Text="TK QSDFWPO Aàâéèêëîïôùûüÿçæœ; BLA BLA BLA...... " />
        <TextBlock Margin="188,157" Name="textBlock11" Text="TK QSDFWPO Aàâéèêëîïôùûüÿçæœ; BLA BLA BLA...... " />
    </Grid>
</ScrollViewer>

также я думаю, что вам нужно пометить событие как обработанное, чтобы предотвратить вертикальную прокрутку:

private void ScrollViewer_PreviewMouseWheel(object sender, MouseWheelEventArgs e)
{
    if (e.Delta > 0)
        scaleTransform.ScaleY =
            scaleTransform.ScaleX += 0.1;
    else
        scaleTransform.ScaleY =
            scaleTransform.ScaleX -= 0.1;

    e.Handled = true;
}
0 голосов
/ 08 апреля 2011

Как уже упоминал Марат, холст не меняет своего размера после своего содержимого. Но мы можем принудительно сделать это следующим образом, назвав родительское окно, например, "myWpfApplication4.MainWindow" и:

<Canvas
  Height="{Binding ElementName=myWpfApplication4.MainWindow, Path=ActualHeight}"
  Width="{Binding ElementName=myWpfApplication4.MainWindow, Path=ActualWidth}">
...