2012-01-31 9 views
0

次のXAMLが与えられたら、私の目標は列AAA、BBB、CCCを常に見えるようにすることです。リストボックスのある列は、すべてゼロにサイズ変更することができます。XAML - この例では要素の幅を0に変更できません

私がリストボックスを削除すると、アプリケーションはまさに私が望むように動作します。つまり、最小幅が尊重されない奇妙な振る舞いはありません。それから、私はBBBまでずっと近いsplitterAをドラッグした場合(BBBは25の所望の幅を維持します)、アプリケーションを起動した後

:リストボックス(またはデータグリッド)で

は以下のXAMLは、この動作を持っていますスプリッタBを右にずらしてドラッグすると、AAAの幅は25になります。

一方、アプリケーションを開始した後、スプリッタAを右にドラッグすると(AAAは希望の幅25)、スプリッタBを右にドラッグすると、AAAが画面から消えます。驚いたことに、スプリッターを左に1ピクセルだけドラッグすると、両方の列が正しい場所に「スナップ」されます。

<Grid Background="CadetBlue" > 
    <Grid.ColumnDefinitions> 
    <ColumnDefinition Width="Auto"/> 
    <ColumnDefinition /> 
    <ColumnDefinition MinWidth="60"/> 
    </Grid.ColumnDefinitions> 
    <TextBlock Text="CCC" Width="25" /> 
    <ListBox Grid.Column="1" /> 
    <GridSplitter Width="5" Grid.Column="2" Name="splitterB" HorizontalAlignment="Left" /> 
    <Grid Background="Aqua" Grid.Column="2" Margin="5,0,0,0" > 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="Auto"/> 
     <ColumnDefinition /> 
     <ColumnDefinition MinWidth="30"/> 
    </Grid.ColumnDefinitions> 
    <TextBlock Text="BBB" Width="25" /> 
    <ListBox Grid.Column="1" /> 

    <GridSplitter Width="5" Grid.Column="2" Name="splitterA" HorizontalAlignment="Left" /> 
    <Grid Background="BurlyWood" Grid.Column="2" Margin="5,0,0,0" > 
     <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="Auto" /> 
     <ColumnDefinition /> 
     </Grid.ColumnDefinitions> 
     <TextBlock Text="AAA" Width="25" /> 
     <ListBox Grid.Column="1" /> 
    </Grid> 
    </Grid> 
</Grid> 

リストボックスを削除するとどうなりますか?

注:質問とXAMLコードを少し変更して、わかりやすく、リストボックスの内容を表示しました。

答えて

0

これは、WPFのバグだ:

https://connect.microsoft.com/VisualStudio/feedback/details/636072/msdn-forum-grid-layout-issue-with-minwidth-starsizing

http://social.msdn.microsoft.com/Forums/en/wpf/thread/24460784-7d09-4627-89fe-975e0ca7b303

私はハックと周りにそれを得ました。誰もがよりよい解決策を持っている場合、私は...それを聞いてみたい

XAML:

<Grid Background="CadetBlue" > 
    <Grid.ColumnDefinitions> 
    <ColumnDefinition Width="Auto"/> 
    <ColumnDefinition /> 
    <ColumnDefinition MinWidth="60"/> 
    </Grid.ColumnDefinitions> 
    <TextBlock Text="CCC" Width="25" /> 
    <ListBox Grid.Column="1" /> 
    <GridSplitter Width="5" Grid.Column="2" Name="splitterB" HorizontalAlignment="Left" DragDelta="splitterB_DragDelta" /> 
    <Grid Background="Aqua" Grid.Column="2" Margin="5,0,0,0" > 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="Auto"/> 
     <ColumnDefinition Name="bbbColumn"/> 
     <ColumnDefinition MinWidth="30"/> 
    </Grid.ColumnDefinitions> 
    <TextBlock Text="BBB" Width="25" /> 
    <ListBox Grid.Column="1" Name="bbbListBox" /> 

    <GridSplitter Width="5" Grid.Column="2" Name="splitterA" HorizontalAlignment="Left" DragDelta="splitterA_DragDelta" /> 
    <Grid Background="BurlyWood" Grid.Column="2" Margin="5,0,0,0" > 
     <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="Auto" /> 
     <ColumnDefinition /> 
     </Grid.ColumnDefinitions> 
     <TextBlock Text="AAA" Width="25" /> 
     <ListBox Grid.Column="1" /> 
    </Grid> 
    </Grid> 
</Grid> 

コード:

private void ToggleWidths() 
{ 
    if (bbbColumn.ActualWidth < 10 
    && bbbListBox.Visibility != System.Windows.Visibility.Collapsed) 
    bbbListBox.Visibility = System.Windows.Visibility.Collapsed; 
    else if (bbbColumn.ActualWidth >= 10 
    && bbbListBox.Visibility != System.Windows.Visibility.Visible) 
    bbbListBox.Visibility = System.Windows.Visibility.Visible; 
} 

private void splitterA_DragDelta(object sender, System.Windows.Controls.Primitives.DragDeltaEventArgs e) 
{ 
    ToggleWidths(); 
} 

private void splitterB_DragDelta(object sender, System.Windows.Controls.Primitives.DragDeltaEventArgs e) 
{ 
    ToggleWidths(); 
} 
1つはdoesnのため、あなたはコピー/貼り付け間違ったXAMLを有していてもよく
0

私は少しコードを使いこなしてきましたが、あなたの主な問題はGridSplittersに独自の列がないことにあります。

GridSplitterの仕組みは、列を直ちに左と右に調整します。 GridSplitterの追加の列を追加するだけではグリッドに4つの列があり、スプリッターの左側にある両方の列が影響を受けるため、グリッドスプリッターの追加列を追加するだけではそれがカットされません。だから私は追加のグリッドにそれらを置くことをお勧めします。

他の問題は、この全体のことがもっときれいに行うことができるように思えますが、外側のグリッド上で持っている50ののminWidthは、GridSplitterの幅を考慮していないので、それは55

あるべきです、このことができます

<Grid Background="CadetBlue"> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition MinWidth="50" Width="Auto"/> 
     <ColumnDefinition Width="3*"/> 
     <ColumnDefinition MinWidth="55" Width="5*"/> 
    </Grid.ColumnDefinitions> 
    <TextBlock Text="CCC" /> 
    <ListBox Grid.Column="0"/> 
    <GridSplitter Width="5" Grid.Column="1" /> 
    <Grid Background="Aqua" Grid.Column="2"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition MinWidth="25"/> 
      <ColumnDefinition Width="3*"/> 
      <ColumnDefinition MinWidth="25" Width="5*" /> 
     </Grid.ColumnDefinitions> 
     <TextBlock Text="BBB"/> 
     <ListBox Margin="0,20,10,20"/> 
     <GridSplitter Width="5" Grid.Column="1" /> 
     <Grid Background="BurlyWood" Grid.Column="2"> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="Auto" /> 
       <ColumnDefinition Width="*"/> 
      </Grid.ColumnDefinitions> 
      <TextBlock Text="AAA" Width="25" /> 
      <ListBox Margin="0,20,10,20" Grid.Column="1" /> 
     </Grid> 
    </Grid> 
</Grid> 

希望:私はあなたが達成しようとしている正確に何か分からないので、しかし、私はいくつかのことを無傷であなたのコードの「精神」を維持し、更新します!

+0

仕事はありません。 CCCとリストボックスは同じ列を共有し、残りは私のコードとほとんど同じです。 – Manuel

+0

申し訳ありません。あなたは正しい、それはまだそこにはない、私はあなたの更新されたコメントを見逃したと思う。しかし、あなたが行っている行動を正確に知らなくても、私はあなたが何であるかを知りませんし、変化したくはありません。 – Phil

+0

私が行っている効果は、AAA、BBB、CCCの列を同時に完全に見えるようにする場合に限り、セクションのサイズを変更し(そして利用可能なスペースに合わせてリストボックスを内側に)変更できるようにすることです。現在のxamlが*ほぼそこにあるように感じますが、何らかの理由でセクションAAAを最初に縮小してからセクションBBBを縮小すると何らかの理由で奇妙な動作をします。 BBBを縮小してからAAAを縮小すると、期待どおりに動作します。 (編集を参照) - おかげで – Manuel

関連する問題