简体   繁体   中英

WPF Scrollviewer not scrolling… No thumb, only responds to mousewheel

I have a WPF.Net 4 application which contains a button that when clicked opens a new windows:

CreationWindow creationWindow = new CreationWindow();
creationWindow.Owner = this;
CreationWindow.Show();

The window shows fine, but the listbox that it contains (say 100 images as listboxitems for content) does not have a thumb on the scrollbar.

Heres a sample of the content of this 'CreationWindow'

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"~
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:Converters="clr-namespace:Krocr.Client.Converters"                  
    x:Class="Krocr.Client.ComparisonMode"
    Title="ComparisonMode" Height="450" Width="700">
  <Grid>
     <ListBox ItemsSource="{Binding Images}"/>
  </Grid>
</Window>

The scrollbar is visible, but I cannot interact with it. The mousewheel does scroll the list.

HOWEVER..

If I add a scrollviewer to my main window, and add some items to it. Subsequent scrollviewers (in new windows) then work correctly...

I haven't altered any styles at all for the listbox or the scrollviewer... Very confused!

Help would be greatly appreciated as it's driving me mad.

EDIT: Added screenshot of problem (cant post images yet as I'm new...)

http://i.stack.imgur.com/XdYSs.png

It's because a Grid by default doesn't constrain the size of its child controls, and so the ListBox doesn't realize it needs to scroll.

The quickest solution is to replace the Grid with a DockPanel, which will constrain its child, but this may need rethinking if you have more child controls to add later!

I figured it out...

It was a crazy visual tree in my mainwindow.xaml, which was breaking the rendering of everything else... Heres the issue:

<Grid Background="#00E5E5E5" Margin="0,75,0,0" Grid.Row="1">
        <Viewbox x:Name="docViewBox" Margin="0">
            <Grid  Margin="5" x:Name="holdingGrid">
                <Canvas x:Name="AggLayer" Margin="0" />

                <Canvas x:Name="rectCanvas"  MouseLeftButtonDown="StartDrag" MouseLeftButtonUp="EndDrag" Background="Transparent"/>
                <ListBox x:Name="overlayCanvas" Background="#00FFFFFF"  IsHitTestVisible="False" ScrollViewer.HorizontalScrollBarVisibility="Disabled" ScrollViewer.VerticalScrollBarVisibility="Disabled">
                    <ListBox.ItemsPanel>
                        <ItemsPanelTemplate>
                            <Canvas Width="{Binding ActualWidth, ElementName=rectCanvas}" Height="{Binding ActualHeight, ElementName=rectCanvas}"/>
                        </ItemsPanelTemplate>
                    </ListBox.ItemsPanel>
                </ListBox>

            </Grid>
        </Viewbox>
        <Canvas x:Name="DialogLayer" Margin="0" />
    </Grid>

With that commented, it works fine... Also that xaml completely breaks blend, causing random crazy behaviour...

Time to optimize I feel... Thanks for the input:)

EDIT: Infact, all I needed to do was remove the Viewbox and things worked fine... very odd EDIT 2: The culprit was the listbox with a canvas itemspanel, this in particular

<Canvas Width="{Binding ActualWidth, ElementName=rectCanvas}" Height="{Binding ActualHeight, ElementName=rectCanvas}"/>

Binding those width and height values was causing the viewbox to get into an infinite scaling loop, which was breaking other things. Silly me...

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM