2011-06-19 19 views
6

Bu kombinasyonda liste görünümümün görünüm dışı kalmasını engelleyen gridspitter ile ilgili bir sorunum var. ,WPF liste görünümü/gridsplitter/scrollviewer yeniden boyutlandırma sorunu

  • Başlat programı pencere boyutu daha büyük
  • sürükleyin kırmızı splitter sürüklemek tüm yol onlar viewport ve yatay dışındadır kadar her iki ListView sütunları genişletin mavi sütun
  • aza indirmek için sola: Yeniden oluşturma adımları kaydırma bu yavaş yavaş pencere dışında ListView iter, Benim için küçük yine

  • Drag pencere boyutunu görünür. ScrollViewer aslında Pencere ile boyut küçültüyor, ancak aynı hızda değil ve yavaşça görünüm dışına çıkıyor. Scrollviewer görünümden kaymaya başladığında, splitter artık kullanılamaz!

    Garip bir şekilde, eğer sol paneli küçültmezsem, bu davranışı alamıyorum!

    Bunun için bir düzeltme ne olurdu?

    <Window x:Class="LayoutTest3.MainWindow" 
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
         Title="MainWindow" Height="600" Width="800" MinHeight="600" MinWidth="800" > 
        <Window.Resources> 
         <XmlDataProvider XPath="/Celebrities/Celebrity" x:Key="celebs"> 
          <x:XData> 
           <Celebrities xmlns=""> 
            <Celebrity Name="Jimmy"> 
             <LastName>Page</LastName> 
            </Celebrity> 
            <Celebrity Name="Johnny"> 
             <LastName>Depp</LastName> 
            </Celebrity> 
            <Celebrity Name="Britney"> 
             <LastName>Spears</LastName> 
            </Celebrity> 
           </Celebrities> 
          </x:XData> 
         </XmlDataProvider> 
    
         <DataTemplate x:Key="NameTemplate"> 
          <TextBlock Text="{Binding [email protected]}" /> 
         </DataTemplate> 
        </Window.Resources> 
    
        <Grid> 
         <Grid.ColumnDefinitions> 
          <ColumnDefinition Width="*" MinWidth="100" /> 
          <ColumnDefinition Width="Auto" /> 
          <ColumnDefinition Width="*" MinWidth="400" /> 
         </Grid.ColumnDefinitions> 
         <Border Grid.Column="0" Background="Blue" /> 
         <GridSplitter Grid.Column="1" Width="5" HorizontalAlignment="Center" ResizeBehavior="PreviousAndNext" VerticalAlignment="Stretch" Background="Red" /> 
         <Border Grid.Column="2" Background="Green"> 
          <ListView ItemsSource="{Binding Source={StaticResource celebs}}"> 
           <ListView.View> 
            <GridView> 
             <GridView.Columns> 
              <GridViewColumn Header="Name" CellTemplate="{StaticResource NameTemplate}" Width="150" /> 
              <GridViewColumn Header="LastName" DisplayMemberBinding="{Binding XPath=LastName}" /> 
             </GridView.Columns> 
            </GridView> 
           </ListView.View> 
          </ListView> 
         </Border> 
        </Grid> 
    </Window> 
    
  • +0

    Cevabımda bir hata yaptım, aslında yıldız boyutu korunuyor, 'Auto'-Sized sütunları somut değerlerle değiştirildi. Ayrıca bu davranış hakkında ne yapacağımı bilmiyorum, bu yüzden iyi bir cevap değil zaten. Fakat bu alt ızgarayı oluşturmaya ihtiyacınız var mı? Ana ızgaradaki başka bir sütun doğru genişletici için yapmaz mı? –

    +0

    Düzenlenen her şeyi kaldırmak için düzenlenmiş soru. – DaveO

    +0

    Bunu tekrarlayamıyorum, WPF'nin hangi sürümünü hedefliyorsunuz? – CodeNaked

    cevap

    7

    hala Izgara görmezden Kol'un MinWidth resized minWidth, GridSplitter ile ilgili bilinen GridSplitter sorun ve Kolon yoktur. Bunun sonucu olarak büyüyen kolonun çocuğu gerçekte mevcut olan daha büyük bir boyuta sahip oluyor. Ancak Izgara düzenleri, MinWidth'i göz önünde bulundurarak ve böylece Shrinking sütununuz MinWidth'de kalmaya devam ediyor, ancak Growing Column'un çocuğu GridSplitter'in küçültme kolonunun MinWidth'in ötesine geçtiğinden emin değil.

    Bunu projemden birinde nasıl çözdüğümü öğreneceğim ve kod yazacağım. Bu arada aşağıdaki seçenekleri deneyebilirsiniz.

    1. sizin Grid Minimum Boyut Splitter 500 + Boyutu olması gerektiğini önceden bilmek, Çocuk

    için MinWidth ekle ColumnDefinition

  • dan MinWidth çıkarın, tüm Grid MinWidth ayarlayabilirsiniz. İşte

  • +0

    Evet, sonunda soruna neden olan MinWidth olduğunu anladım. Lütfen cevabınızı da gönderin, böylece seçeneklerimiz var. Teşekkürler! – DaveO

    2

    Ben de öyle yapmıştım: arkasında

    <Grid Name="container" SizeChanged="container_SizeChanged"> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition /> 
         <ColumnDefinition Name="rightPanel" Width="*" MinWidth="100"/> 
        </Grid.ColumnDefinitions> 
        <TextBlock Grid.Column="0" Background="Red" Foreground="White">Test</TextBlock> 
        <GridSplitter Grid.Column="0" VerticalAlignment="Stretch" HorizontalAlignment="Right" Width="2" Height="Auto" ResizeDirection="Columns"/> 
        <Border Grid.Column="1" Background="Green" Margin="0 0 0 0"> 
         <ListView ItemsSource="{Binding Source={StaticResource celebs}}"> 
          <ListView.View> 
           <GridView> 
            <GridView.Columns> 
             <GridViewColumn Header="Name" CellTemplate="{StaticResource NameTemplate}" Width="150" /> 
             <GridViewColumn Header="LastName" DisplayMemberBinding="{Binding XPath=LastName}" /> 
            </GridView.Columns> 
           </GridView> 
          </ListView.View> 
         </ListView> 
        </Border> 
    </Grid> 
    

    ve kod (iğrenç!):

    private void container_SizeChanged(object sender, SizeChangedEventArgs e) 
    { 
        rightPanel.MaxWidth = container.ActualWidth - 150; 
    } 
    

    Temelde dk genişliğini çıkarıp diğer yandan MaxWidth ayarlamak için benzer bir hesaplama yapmak panel.

    1

    Belki de bu yardımcı olabilir, her zaman genişlik/yükseklik için aynı türde bir birim kullanmanız gerekir veya splitter düzgün çalışmayabilir.

    <Grid> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="1*" MinWidth="150"/> 
         <ColumnDefinition Width="4*" MinWidth="150"/> 
        </Grid.ColumnDefinitions> 
    
        <ListView Grid.Column="0" BorderBrush="#FF005BFF" Margin="0,0,5,0"> 
         <ListView.View> 
          <GridView> 
           <GridViewColumn /> 
          </GridView> 
         </ListView.View> 
        </ListView> 
    
        <GridSplitter Grid.Column="1" 
            HorizontalAlignment="Left" VerticalAlignment="Stretch" 
            Background="Black" 
            ShowsPreview="true" 
            Width="2" /> 
    
        <ListView Grid.Column="1" BorderBrush="#FFFF5100" Margin="5,0,0,0"> 
         <ListView.View> 
          <GridView> 
           <GridViewColumn /> 
          </GridView> 
         </ListView.View> 
        </ListView> 
    </Grid>