none
dificuldade com dimensionamento de GridSplitter RRS feed

  • Pergunta

  • na aplicação principal, certa função abrirá na parte principal da tela um usercontrol, que contém um grid, que é dividido p/ acomodar um canvas e webbrowser.

    código: <Grid HorizontalAlignment="Stretch" Width="Auto"
            MaxWidth="Infinity"
            Loaded="Grid_Loaded">
        <Grid.ColumnDefinitions>
          <ColumnDefinition Width="200*" MinWidth="15" MaxWidth="Infinity" />
          <ColumnDefinition MaxWidth="5"/>
          <ColumnDefinition Width="100*" MinWidth="2"/>
        </Grid.ColumnDefinitions>

    à direita deste user control, está um conjunto de 3 painel montados em tempo de execução.

    Não há meio que eu consiga fazer o grid com o canvas e o browser ocuparem todo espaço disponível, qdo isto ocorre, o gridsplitter deforma o conteúdo do browser.

    resumidamente, as definições do restante deste UC:

    <Canvas Name="cnvDesenho" Grid.Column="0" Background="Black"
                HorizontalAlignment="Stretch"
                ScrollViewer.HorizontalScrollBarVisibility="Auto"
                ScrollViewer.VerticalScrollBarVisibility="Auto"
                PreviewMouseLeftButtonDown="canvas_MouseLeftButtonDown"
                PreviewMouseMove="canvas_PreviewMouseMove"
                PreviewMouseLeftButtonUp="canvas_MouseLeftButtonUp">

    <GridSplitter Grid.Column="1" HorizontalAlignment="Center"
                      Width="2" Panel.ZIndex="1" Margin="1" MaxWidth="6"
                      ResizeBehavior="PreviousAndNext"
                      ResizeDirection="Columns"
                      />
        <WebBrowser x:Name="paginaweb" Grid.Column="2"
                    HorizontalAlignment="Stretch"                
                    ScrollViewer.HorizontalScrollBarVisibility="Auto"
                    ScrollViewer.VerticalScrollBarVisibility="Auto" 
                    Source="http://www.google.com"  />

    Enfim, seria possível ajustar o tamanho deste grid p/ ocupar o espaço disponível?

    já tentei no evento load ajustar a largura do grid à largura da janela principal, menos a largura do painel direito, que é fixa, mas não deu certo tb.

    já listo isto aqui:http://stackoverflow.com/questions/375841/wpf-gridsplitter-doesnt-work-with-webbrowser-control

    mas não parece o mesmo comportamento.

    quarta-feira, 6 de outubro de 2010 18:58

Respostas

  • olha só, em tempo de execução, na tela principal serão acrescentados os user controls que criam os painéis à esquerda, que são do tipo DockableContent, e o DockingManager que é um AvalonDock.DocumentContent.

    eu fiz testes isolados, montando só grid c/ gridsplitter, só user control, e cada um funciona de acordo, agora eu mudei umas linhas na lógica de construção desta interface, e só não consigo fazer com que o tamanho deste DocumentContent preencha o espaço disponível na tela.

    Se tivesse algo do tipo LastChildFill que existe pro dockpanel,  pra isto, creio que resolveria meu problema.

    # editando

    na verdade, existe, no avalondock.documentcontent , resolvido!


    Chris
    • Editado Chris_lynx quarta-feira, 13 de outubro de 2010 13:20 encontrei a resposta
    • Marcado como Resposta Chris_lynx quarta-feira, 13 de outubro de 2010 13:20
    quarta-feira, 13 de outubro de 2010 12:20

Todas as Respostas

  • Não tenho todo o código do seu controle, mas o GridSplitter é filho do Canvas ou da Grid? No seu código, ele está como filho do Canvas, pois o Canvas não tem a tag final

    Bruno


    MVP Client Development - http://msmvps.com/blogs/bsonnino
    quarta-feira, 6 de outubro de 2010 19:42
  • ops, ato falho, pertence ao grid.

    ......

     </Canvas>

    <GridSplitter Grid.Column="1" HorizontalAlignment="Center"
                      Width="2" Panel.ZIndex="1" Margin="1" MaxWidth="6"
                      ResizeBehavior="PreviousAndNext"
                      ResizeDirection="Columns"
                      /> ......


    Chris
    quarta-feira, 6 de outubro de 2010 20:07
  • Não entendi sua pergunta: montei um xaml como o seguinte:

    <Window x:Class="GridSplitter.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
      <Grid HorizontalAlignment="Stretch" Width="Auto"
        MaxWidth="Infinity">
        <Grid.ColumnDefinitions>
          <ColumnDefinition Width="200*" MinWidth="15" MaxWidth="Infinity" />
          <ColumnDefinition MaxWidth="5"/>
          <ColumnDefinition Width="100*" MinWidth="2"/>
        </Grid.ColumnDefinitions>
        <Canvas Name="cnvDesenho" Grid.Column="0" Background="Black" 
          HorizontalAlignment="Stretch"
          ScrollViewer.HorizontalScrollBarVisibility="Auto" 
          ScrollViewer.VerticalScrollBarVisibility="Auto" />
        <GridSplitter Grid.Column="1" HorizontalAlignment="Center"
             Width="2" Panel.ZIndex="1" Margin="1" MaxWidth="6"
             ResizeBehavior="PreviousAndNext"
             ResizeDirection="Columns" />
        <WebBrowser x:Name="paginaweb" Grid.Column="2" 
            HorizontalAlignment="Stretch"         
            ScrollViewer.HorizontalScrollBarVisibility="Auto" 
            ScrollViewer.VerticalScrollBarVisibility="Auto" 
            Source="http://www.google.com" />
    
      </Grid>
    </Window>
    
    

    e a grid preenche toda tela. Acredito que algo que você está fazendo no Code Behind está prejudicando seu layout

    Bruno


    MVP Client Development - http://msmvps.com/blogs/bsonnino
    quinta-feira, 7 de outubro de 2010 09:08
  • Bruno, vc tem razão, porém, como te disse este controle está num user control, bem parecido com a IDE do VS2008. Tentarei descrever melhor, farei uma analogia com a IDE do VS, na qual temos a janela de design e as janelas de soluções e propriedades (geral// à direita).

    Então, nesta analogia, este grid representa a janela de design, que neste caso contém o canvas e o webbrowser, e à direita ficará um painel de propriedades, com largura fixa 200.

    qdo aciono o menu para gerar o grid, o painel de propriedades à direita é carregado e fica uma vazio entre o grid e o painel.

    Tento alterar a propr. width do UC c/ grid e não resolve. o UC do painel de propriedds tem largura fixa, 200.

    Bom, sei ainda que este UC é montado através de um arquivo xml, que contém o seguinte:

     

    < DockingManager >
    - < ResizingPanel ResizeWidth =" * " ResizeHeight =" * " EffectiveSize =" 0,0 " Orientation =" Horizontal " >
    - < ResizingPanel ResizeWidth =" * " ResizeHeight =" * " EffectiveSize =" 1000,680 " Orientation =" Vertical " >
    - < ResizingPanel ResizeWidth =" * " ResizeHeight =" * " EffectiveSize =" 1000,550 " Orientation =" Horizontal " >
    - < ResizingPanel ResizeWidth =" 200 " ResizeHeight =" * " EffectiveSize =" 200,550 " Orientation =" Vertical " >
    - < DockablePane ResizeWidth =" 200 " ResizeHeight =" * " EffectiveSize =" 200,273 " Anchor =" Left " >
      < DockableContent Name =" listaObrasContent " AutoHide =" true " />
      </ DockablePane >
    - < DockablePane ResizeWidth =" 200 " ResizeHeight =" * " EffectiveSize =" 200,273 " Anchor =" Left " >
      < DockableContent Name =" detalhesObrasContent " AutoHide =" true " />
      </ DockablePane >
      </ ResizingPanel >
      < DocumentPanePlaceHolder />
    - < ResizingPanel ResizeWidth =" 200 " ResizeHeight =" * " EffectiveSize =" 200,550 " Orientation =" Vertical " >
    - < DockablePane ResizeWidth =" 200 " ResizeHeight =" * " EffectiveSize =" 200,273 " Anchor =" Right " >
      < DockableContent Name =" elementosContent " AutoHide =" false " />
      </ DockablePane >
    - < DockablePane ResizeWidth =" 200 " ResizeHeight =" * " EffectiveSize =" 200,273 " Anchor =" Right " >
      < DockableContent Name =" propriedadesContent " AutoHide =" false " />
      </ DockablePane >
    - < DockablePane ResizeWidth =" 200 " ResizeHeight =" 540 " EffectiveSize =" 225,540 " Anchor =" Right " >
      < DockableContent Name =" filtroContent " AutoHide =" true " />
      </ DockablePane >
      </ ResizingPanel >
      </ ResizingPanel >
    - < ResizingPanel ResizeWidth =" * " ResizeHeight =" 125 " EffectiveSize =" 1000,125 " Orientation =" Horizontal " >
    - < DockablePane ResizeWidth =" * " ResizeHeight =" * " EffectiveSize =" 500,125 " Anchor =" Bottom " >
      < DockableContent Name =" resultadosContent " AutoHide =" false " />
      </ DockablePane >
    - < DockablePane ResizeWidth =" * " ResizeHeight =" * " EffectiveSize =" 500,125 " Anchor =" Bottom " >
      < DockableContent Name =" mensagensContent " AutoHide =" false " />
      </ DockablePane >
      </ ResizingPanel >
      </ ResizingPanel >
      </ ResizingPanel >
      < Hidden />
      < Windows />
      </ DockingManager >

    o que eu entendi disto é que este dockablepane tá sendo gerado em tempo de execução, e a propr. width foi estabelecida como 200.
    Bom, é isto que tenho... não sei se consegui fornecer as informações suficientes...

    Chris
    quinta-feira, 7 de outubro de 2010 12:00
  • vasculhando mais o código, existe um parte onde é montado este UC em runtime:

    eu adicionei algumas linhas, e melhorei o funcionamento, mas agora, não consigo fazer o grid ocupar todo o espaço.

    UC01 tempUC = new UC01 (IDrawing.RedeAtiva);
            tempUC.AbrirPainelPropriedades += new EventHandler(IniciarPainelElementosPropriedades);
            tempUC.HorizontalAlignment = HorizontalAlignment.Stretch;
            tmpDoc.Content = tempUC;
            tmpDoc.Width = Application.Current.MainWindow.ActualWidth;
            pnlDocumentos.Items.Clear();
            // alterei isto p/ ajustar tamanho
            pnlDocumentos.HorizontalAlignment = HorizontalAlignment.Stretch;
            //pnlDocumentos.Width = Application.Current.MainWindow.Width - 220;
           
            pnlDocumentos.Items.Add(tmpDoc); // Adicionando Documento ao Painel

    se eu encontrar como ajustar o tamanho do container deste grid, creio que resolvo  o problema, porém, tentei através do evento mouseenter ver a propr. width, mas só obtenho o valor

    do grid do canvas. a princípio, deveria acessar o valor deste UC que o contém, (até consigo obter no debug - base-framework element..) mas não estou achando...


    Chris
    quinta-feira, 7 de outubro de 2010 13:32
  • Este seu DockingManager (que não sei qual é) deve estar fazendo isso, você já viu o que há com ele?

    []s

    Bruno


    MVP Client Development - http://msmvps.com/blogs/bsonnino
    quinta-feira, 7 de outubro de 2010 18:52
  • Então, o comportamento está bem estranho.

    Existe a parte que constrói interface durante a execução.

    Todas as propriedades horizontalalignment = stretch.

    e qdo eu coloco o tamanho do uc p/ a largura que desejo, desconfigura  o gridsplitter.

    se eu não mudo e deixo width = auto, fica certinho, porém ocupando apenas metade do espaço livre disponível.

    este docking manager é o framework que define os uc's. está na interface principal, pertence ao AvalonDock.

    bom, pouco progresso até agora, mas grato pela atenção dispensada.


    Chris
    quinta-feira, 7 de outubro de 2010 20:08
  • Comece aos poucos, tire o DockingManager e veja se fica bom, então vá pondo o DockingManager aos poucos.

    []s

    Bruno


    MVP Client Development - http://msmvps.com/blogs/bsonnino
    quinta-feira, 7 de outubro de 2010 20:36
  • olha só, em tempo de execução, na tela principal serão acrescentados os user controls que criam os painéis à esquerda, que são do tipo DockableContent, e o DockingManager que é um AvalonDock.DocumentContent.

    eu fiz testes isolados, montando só grid c/ gridsplitter, só user control, e cada um funciona de acordo, agora eu mudei umas linhas na lógica de construção desta interface, e só não consigo fazer com que o tamanho deste DocumentContent preencha o espaço disponível na tela.

    Se tivesse algo do tipo LastChildFill que existe pro dockpanel,  pra isto, creio que resolveria meu problema.

    # editando

    na verdade, existe, no avalondock.documentcontent , resolvido!


    Chris
    • Editado Chris_lynx quarta-feira, 13 de outubro de 2010 13:20 encontrei a resposta
    • Marcado como Resposta Chris_lynx quarta-feira, 13 de outubro de 2010 13:20
    quarta-feira, 13 de outubro de 2010 12:20