2011-08-02 5 views
0

スプリッタを使用して列の幅を変更できる2列レイアウトを作成しようとしています。ブラウザウィンドウのサイズを変更すると、右の列の幅が変わることはありません(グリッドの幅に比例してはいけません)。両方の列は最小幅を持つ必要があります。ブラウザのウィンドウが狭すぎて両方の列を表示できない場合は、スクロールバーが表示されます。Silverlight:予期せず動作するScrollViewer内のGridSplitter

これは私のXAMLである:私がいる

<Grid x:Name="LayoutRoot" Background="White"> 
    <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Disabled"> 
     <Grid Height="200" Margin="0,0,0,0" MinWidth="400" VerticalAlignment="Top"> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition MinWidth="300" Width="300*" /> 
       <ColumnDefinition Width="10" /> 
       <ColumnDefinition MinWidth="100" Width="100"/> 
      </Grid.ColumnDefinitions> 
      <Grid Grid.Column="0" Background="Red" x:Name="LeftColumn"></Grid> 
      <sdk:GridSplitter Grid.Column="1" HorizontalAlignment="Center" Width="10" Background="Black" /> 
      <Grid Grid.Column="2" Background="Green" x:Name="RightColumn"></Grid> 
     </Grid> 
    </ScrollViewer> 
</Grid> 

問題は、スプリッタを左にドラッグしたときで、左の列ののminWidthに達した - 右の欄には、非常に急速に成長し始め、スクロールバー表示されます。右の列から幅の設定を削除すると、奇妙な動作はなくなりましたが、ウィンドウのサイズが変更されたときに右の列が比例して拡大し始めます...

ドラッグしたときと同じ振る舞いをしたい右 - 私はそれがminwidthに達した後に停止したいと思います。

+0

奇妙な動作...しかし、3番目の列の幅を100 *に設定すると、成長が止まりました。ところで、なぜScrollViewerの中にグリッドを置いたのですか? – NestorArturo

+0

@NestorArturo - 幅を100 *に設定すると、3番目の列が比例します。これは必要な動作ではありません。ブラウザのウィンドウがグリッドの最小幅より狭くなると、水平スクロールバーが表示され、UIは引き続き使用できるように、スクロールビューア内にグリッドを配置します。 – boris

+0

「*」を一切使用しないでテストしてください。 – NestorArturo

答えて

0

私は最終的に回避策を考え出すことができたと思います。私はレイアウトが変化しているときにコードビハインドで幅を強制しています。

XAML:

<Grid x:Name="LayoutRoot" Background="White"> 
    <ScrollViewer x:Name="Scroller" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Disabled"> 
     <Grid x:Name="Workspace" Height="200" Margin="0,0,0,0" MinWidth="400" VerticalAlignment="Top" LayoutUpdated="Workspace_LayoutUpdated"> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition MinWidth="300" Width="300*" /> 
       <ColumnDefinition Width="10" /> 
       <ColumnDefinition MinWidth="100" Width="100"/> 
      </Grid.ColumnDefinitions> 
      <Grid Grid.Column="0" Background="Red" x:Name="LeftColumn"></Grid> 
      <sdk:GridSplitter Grid.Column="1" HorizontalAlignment="Center" Width="10" Background="Black" /> 
      <Grid Grid.Column="2" Background="Green" x:Name="RightColumn"></Grid> 
     </Grid> 
    </ScrollViewer> 
</Grid> 

コードの背後にある:

public partial class MainPage : UserControl 
{ 
    public MainPage() 
    { 
     InitializeComponent(); 
    } 

    private void Workspace_LayoutUpdated(object sender, EventArgs e) 
    { 
     Workspace.Width = Scroller.ViewportWidth - 1; 
    } 

} 
0

"Horizo​​ntalScrollBarVisibility"を無効にする必要があります。 このコードは、私の作品:

<Grid x:Name="LayoutRoot" Background="White"> 
    <ScrollViewer HorizontalScrollBarVisibility="Disabled" VerticalScrollBarVisibility="Disabled"> 
     <Grid Height="200" Margin="0,0,0,0" MinWidth="400" VerticalAlignment="Top"> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition MinWidth="300" Width="300*" /> 
       <ColumnDefinition Width="10" /> 
       <ColumnDefinition MinWidth="100" Width="100"/> 
      </Grid.ColumnDefinitions> 
      <Grid Grid.Column="0" Background="Red" x:Name="LeftColumn"></Grid> 
      <sdk:GridSplitter Grid.Column="1" HorizontalAlignment="Center" Width="10" Background="Black" /> 
      <Grid Grid.Column="2" Background="Green" x:Name="RightColumn"></Grid> 
     </Grid> 
    </ScrollViewer> 
</Grid> 

ScrollViewerのがグリッドに成長する無限のスペースを提供します。したがって、minWidthは決して停止しません。 明らかに、垂直方向と水平方向の両方で無効になっているScrollViewerは必要ありません。すべての列のコンテンツを囲むスクロールバーをグリッドの内側に移動する方が効果的です。

+0

残念ながら、私は列の内容の内部にスクロールバーを移動することはできません。私はブラウザウィンドウが許容範囲内のビューを提供するには狭すぎる場合、グリッド全体を水平方向にスクロールできる必要があります。あなたが正しく気づいているように、スクロールバーが完全に無効になっているScrollViewerを使用することは目的がありません。 – boris

+0

ここで起こるのは、スクロールビューアが直下の子供に無限のスペースを与えているということです... ScrollViewerをLayoutRootとして配置することができますので、グリッドは外部グリッドの直下の子ですか? – NestorArturo

0

それはこのように動作理由あなたはアスタリスクとの最初の列Width="300*"、 と3列目Width="100"をせずに指定されていることですアスタリスク。

アスタリスクを1番目と3番目の列に置くか、またはそれぞれ削除するだけで、目的の通りに動作します。

+1

Verbeia - アスタリスクやスターサイズを両方の列に追加するのはなぜこのトリックですか?私は同じ問題にぶつかっていますが、何かが選択されるまで右の列が常に表示されるわけではなく、その時点で右の列に表示されているユーザーコントロールのサイズ(つまり列の幅= auto)しかし、もし私がこれを行うと、それはひどく振舞う... – fortpointuiguy

関連する問題