Usuário com melhor resposta
dificuldade com dimensionamento de GridSplitter

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.
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
Todas as Respostas
-
-
-
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 -
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 -
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 Painelse 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 -
-
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 -
-
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