2013-08-16 80 views
4

使用下面的XAML將GridSplitter向左拖動時,它將元素從窗口中移出。 如何保存窗框內的所有元素?有沒有辦法讓GridSplitter不要將元素從窗口中移出?

<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="*"/> 
     <ColumnDefinition Width="auto"/> 
     <ColumnDefinition Width="auto"/> 
    </Grid.ColumnDefinitions> 

    <Button Grid.Column="0" Content="0" /> 
    <Button Grid.Column="1" Content="1" /> 
    <Button Grid.Column="2" Content="2" /> 
    <GridSplitter Grid.Column="1" Width="5" HorizontalAlignment="Left" /> 
</Grid> 

感謝

+0

背後嘗試設置'MinWidth'爲'Grid'的'ColumnDefinitions'。 – Nitesh

+0

感謝您的回覆。試過了,沒有運氣。我也試過*大小的列沒有結果。當我將窗口大小更改爲其內容時,控件將保留在窗口框架中,但窗口大小會發生變化。理想情況下,我希望實現窗口大小是固定的,並且所有其他大小都是自動大小/比例大小的。 – elm

回答

3

我知道解決你的問題是有被留下,你的gridsplitter權已經寬度屬性設置爲Width="*"列,並給予GridSplitter自己的列用的Horizo​​ntalAlignment的唯一途徑設置爲HorizontalAlignment="Stretch"。你的代碼最終會看起來像這樣。

<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="*"/> 
     <ColumnDefinition Width="auto"/> 
     <ColumnDefinition Width="*"/> 
     <ColumnDefinition Width="auto"/> 
    </Grid.ColumnDefinitions> 

    <Button Grid.Column="0" Content="0" /> 
    <GridSplitter Grid.Column="1" Width="5" HorizontalAlignment="Stretch"/> 
    <Button Grid.Column="2" Content="1" /> 
    <Button Grid.Column="3" Content="2" /> 
</Grid> 
1

我有這個相同的問題,並提出了這個解決方案。基本上,想法是在網格/列更改時動態更改適當列的MaxWidth。我在這裏展示了兩列,但我已經成功使用了三列的這種方法。

使用這種方法,如果您調整窗口大小不再適合網格的內容,網格會停止更改大小,因此ResizeGrid_SizeChanged事件將停止調用。爲了解決這個問題,您還可以偵聽窗口(或用戶控件)尺寸更改事件。您可能還需要適當地綁定網格的MaxWidth,或者如果網格填充窗口/ UserControl,則直接使用控件大小。我已經展示瞭如何通過XAML在這裏綁定MaxWidth屬性。如果您不想這樣做,則可以在後面的窗口代碼中將「ResizeGrid.MaxWidth」替換爲「ActualWidth」,並在「ResizeGrid」對象上刪除「MaxWidth」綁定。

XAML:

<Window x:Class="App.Window1" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:Default="clr-namespace:App" 
     mc:Ignorable="d" 
     SizeChanged="Window_SizeChanged" 
     Title="Window1" Height="300" Width="300"> 
    <Grid> 
     <Grid x:Name="ResizeGrid" SizeChanged="ResizeGrid_SizeChanged" 
       MaxWidth="{Binding ActualWidth, Mode=OneWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Default:Window1}}}"> 

      <Grid.ColumnDefinitions> 
       <ColumnDefinition x:Name="C0" Width="150" MinWidth="50" /> 
       <ColumnDefinition Width="5" /> 
       <ColumnDefinition x:Name="C2" Width="*" MinWidth="50" /> 
      </Grid.ColumnDefinitions> 

      <Grid Grid.Column="0" Background="Green"> 
       <Label Content="Left" /> 
       <Label Content="Right" HorizontalAlignment="Right" /> 
      </Grid> 

      <GridSplitter Grid.Column="1" Width="5" HorizontalAlignment="Stretch" DragCompleted="GridSplitter_DragCompleted" /> 

      <Grid Grid.Column="2" Background="Red"> 
       <Label Content="Left" /> 
       <Label Content="Right" HorizontalAlignment="Right" /> 
      </Grid> 
     </Grid> 
    </Grid> 
</Window> 

C#代碼

private void Window_SizeChanged(object sender, SizeChangedEventArgs e) 
{ 
    UpdateGridSplitterWidths(); 
} 

private void ResizeGrid_SizeChanged(object sender, SizeChangedEventArgs e) 
{ 
    UpdateGridSplitterWidths(); 
} 

private void GridSplitter_DragCompleted(object sender, System.Windows.Controls.Primitives.DragCompletedEventArgs e) 
{ 
    UpdateGridSplitterWidths(); 
} 

private void UpdateGridSplitterWidths() 
{ 
    C0.MaxWidth = Math.Min(ResizeGrid.ActualWidth, ResizeGrid.MaxWidth) - (C2.MinWidth + 5); 
} 
相關問題