2015-05-08 177 views
2

調整應用程序的窗口大小時遇到​​問題。我有兩個DataGrid,每個DataGrid都放置在它自己的Grid of Grid中,另一個Grid放置在Grid GridSplitter的中間,用於調整DataGrid的大小。使用WPF中的dataGrid調整大小的網格

Everything is OK

通過從這種狀態降低窗口寬度,我需要得到這個:

I want this

這樣,每一列和窗口會打的MinWidth。 但是,相反的,我得到這個(左列不是在其MinWidth):

Complete mess

我注意到,它是在DataGrid是停止/減速網格的列萎縮列導致最小尺寸的窗口切割第二部分。當列更寬時,另一列也會發生同樣的情況。

這是我的XAML文件:

<Window x:Class="DC_SB.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Application" Height="350" Width="525" MinWidth="430" MinHeight="150" Background="WhiteSmoke"> 
<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition Height="*" /> 
    </Grid.RowDefinitions> 
    <Menu Grid.Row="0" Background="#FFE0E0E0"> 
     <MenuItem Header="Settings"> 
      <MenuItem Header="Key bindings" Click="keyBindings" /> 
      <MenuItem Header="Color settings" Click="colorSettings" /> 
     </MenuItem> 
     <MenuItem Header="View"> 
      <MenuItem x:Name="ViewCounters" Header="Counters" IsCheckable="True" IsChecked="True" Click="OnMouseDownView" /> 
      <MenuItem x:Name="ViewSounds" Header="Sounds" IsCheckable="True" IsChecked="True" Click="OnMouseDownView" /> 
     </MenuItem> 
     <MenuItem Header="Enable"> 
      <MenuItem x:Name="EnableCounters" Header="Counters" IsCheckable="True" IsChecked="True" Click="OnMouseDownEnable" /> 
      <MenuItem x:Name="EnableSounds" Header="Sounds" IsCheckable="True" IsChecked="True" Click="OnMouseDownEnable" /> 
     </MenuItem> 
    </Menu> 

    <Grid Grid.Row="1" x:Name="Grid" > 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="*" MinWidth="205" /> 
      <ColumnDefinition Width="Auto" /> 
      <ColumnDefinition Width="*" MinWidth="205" /> 
     </Grid.ColumnDefinitions> 

     <GridSplitter Margin="0,25,0,10" Grid.Column="1" ResizeBehavior="PreviousAndNext" Width="3" /> 

     <Grid x:Name="CountersGrid" Grid.Column="0"> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="Auto" /> 
       <RowDefinition Height="*" /> 
       <RowDefinition Height="Auto" /> 
      </Grid.RowDefinitions> 

      <Label Grid.Row="0" Content="Counters" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="10,0,0,0" /> 

      <DataGrid x:Name="CountersList" Grid.Row="1" HorizontalAlignment="Stretch" Margin="10,0,10,10" AutoGenerateColumns="False" VerticalAlignment="Stretch" 
         CanUserResizeColumns="True" CanUserReorderColumns="False" CanUserSortColumns="False" SelectionMode="Single" CanUserDeleteRows="False" 
         CanUserAddRows="False" CanUserResizeRows="False" SelectionUnit="FullRow" MouseDoubleClick="OnDoubleClick" HeadersVisibility="Column" > 
       <DataGrid.Columns> 
        <DataGridTextColumn Header="Name" IsReadOnly="True" Binding="{Binding Path=Name}" /> 
        <DataGridTextColumn Header="Path" IsReadOnly="True" Binding="{Binding Path=Path}" /> 
        <DataGridTextColumn Header="Count" IsReadOnly="True" Binding="{Binding Path=CountKey}" /> 
       </DataGrid.Columns> 
       <DataGrid.Resources> 
        <Style TargetType="{x:Type DataGridColumnHeader}"> 
         <Setter Property="Foreground" Value="Black" /> 
        </Style> 
       </DataGrid.Resources> 
      </DataGrid> 

      <Button Grid.Row="2" Content="Add" HorizontalAlignment="Left" Margin="10,0,0,10" VerticalAlignment="Bottom" Width="60" Click="addCounter" /> 
      <Button Grid.Row="2" Content="Remove" HorizontalAlignment="Left" Margin="75,0,0,10" VerticalAlignment="Bottom" Width="60" Click="removeCounter" /> 
      <Button Grid.Row="2" Content="-" HorizontalAlignment="Right" Margin="0,0,40,10" VerticalAlignment="Bottom" Width="25" Click="decrement" /> 
      <Button Grid.Row="2" Content="+" HorizontalAlignment="Right" Margin="0,0,10,10" VerticalAlignment="Bottom" Width="25" Click="increment" /> 
     </Grid> 

     <Grid x:Name="SoundsGrid" Grid.Column="2"> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="Auto" /> 
       <RowDefinition Height="*" /> 
       <RowDefinition Height="Auto" /> 
      </Grid.RowDefinitions> 

      <Label Grid.Row="0" Content="Sounds" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="10,0,0,0" /> 
      <Image Grid.Row="0" HorizontalAlignment="Right" Margin="0,8,110,0" VerticalAlignment="Top" Height="10" Width="10" > 
       <Image.Source> 
        <BitmapImage UriSource="volume.png" /> 
       </Image.Source> 
      </Image> 
      <Slider x:Name="Slider" Grid.Row="0" HorizontalAlignment="Right" VerticalAlignment="Bottom" Margin="0,0,10,5" Width="100" Maximum="100" Minimum="0" 
        AutoToolTipPlacement="BottomRight" IsMoveToPointEnabled="True" ValueChanged="volume" > 
       <Slider.LayoutTransform> 
        <ScaleTransform ScaleY="0.75" CenterX="15" CenterY="15"/> 
       </Slider.LayoutTransform> 
      </Slider> 

      <DataGrid x:Name="SoundsList" Grid.Row="1" HorizontalAlignment="Stretch" Margin="10,0,10,10" AutoGenerateColumns="False" VerticalAlignment="Stretch" 
         CanUserResizeColumns="True" CanUserReorderColumns="False" CanUserSortColumns="False" SelectionMode="Single" CanUserDeleteRows="False" 
         CanUserAddRows="False" CanUserResizeRows="False" SelectionUnit="FullRow" MouseDoubleClick="OnDoubleClick" HeadersVisibility="Column" > 
       <DataGrid.Columns> 
        <DataGridTextColumn Header="Name" IsReadOnly="True" Binding="{Binding Path=Name}" /> 
        <DataGridTextColumn Header="Path" IsReadOnly="True" Binding="{Binding Path=Path}" /> 
        <DataGridTextColumn Header="Key" IsReadOnly="True" Binding="{Binding Path=CountKey}" /> 
       </DataGrid.Columns> 
       <DataGrid.Resources> 
        <Style TargetType="{x:Type DataGridColumnHeader}"> 
         <Setter Property="Foreground" Value="Black" /> 
        </Style> 
       </DataGrid.Resources> 
      </DataGrid> 

      <Button Grid.Row="2" Content="Add" HorizontalAlignment="Left" Margin="10,0,0,10" VerticalAlignment="Bottom" Width="60" Click="addSound" /> 
      <Button Grid.Row="2" Content="Remove" HorizontalAlignment="Left" Margin="75,0,0,10" VerticalAlignment="Bottom" Width="60" Click="removeSound" /> 
      <Button Grid.Row="2" HorizontalAlignment="Right" Margin="0,0,40,10" VerticalAlignment="Bottom" Width="25" Height="22" Click="play" > 
        <Image Source="play.png" Width="8" Height="8" /> 
      </Button> 
      <Button Grid.Row="2" HorizontalAlignment="Right" Margin="0,0,10,10" VerticalAlignment="Bottom" Width="25" Height="22" Click="stop" > 
       <Image Source="stop.png" Width="8" Height="8" /> 
      </Button> 
     </Grid> 
    </Grid> 
</Grid> 

我需要的是讓它儘量的DataGrid不infulence網格列的調整。 感謝您的幫助

+0

使用'SizeToContent = 「WidthAndHeight」'你的窗口設置 – prasy

+0

不,不利於 – user1869453

+0

嘗試設置'MinWidth = 「430」''要和Auto'使用'SizeToContent = 「WidthAndHeight」' – prasy

回答

2

下面是你的代碼和我的改變。我已經刪除了MinWidth值並解決了問題。兩個面板保持平等。如果您希望爲整個面板設置最小尺寸,那將有效地爲網格中的每個列創建最小寬度。看起來你已經有了,雖然:

<Window x:Class="WPFTestApp.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:System="clr-namespace:System;assembly=mscorlib" 
    xmlns:Collections="clr-namespace:System.Collections;assembly=mscorlib" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:l="clr-namespace:WPFTestApp" 
    Title="MainWindow" Height="350" Width="525" MinWidth ="430"> 
<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition Height="*" /> 
    </Grid.RowDefinitions> 
    <Menu Grid.Row="0" Background="#FFE0E0E0"> 
     <MenuItem Header="Settings"> 
      <MenuItem Header="Key bindings" Click="keyBindings" /> 
      <MenuItem Header="Color settings" Click="colorSettings" /> 
     </MenuItem> 
     <MenuItem Header="View"> 
      <MenuItem x:Name="ViewCounters" Header="Counters" IsCheckable="True" IsChecked="True" Click="OnMouseDownView" /> 
      <MenuItem x:Name="ViewSounds" Header="Sounds" IsCheckable="True" IsChecked="True" Click="OnMouseDownView" /> 
     </MenuItem> 
     <MenuItem Header="Enable"> 
      <MenuItem x:Name="EnableCounters" Header="Counters" IsCheckable="True" IsChecked="True" Click="OnMouseDownEnable" /> 
      <MenuItem x:Name="EnableSounds" Header="Sounds" IsCheckable="True" IsChecked="True" Click="OnMouseDownEnable" /> 
     </MenuItem> 
    </Menu> 

    <Grid Grid.Row="1" x:Name="Grid" > 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="*" MinWidth="0" /> 
      <ColumnDefinition Width="Auto" /> 
      <ColumnDefinition Width="*" MinWidth="0" /> 
     </Grid.ColumnDefinitions> 

     <GridSplitter Margin="0,25,0,10" Grid.Column="1" ResizeBehavior="PreviousAndNext" Width="3" /> 

     <Grid x:Name="CountersGrid" Grid.Column="0"> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="Auto" /> 
       <RowDefinition Height="*" /> 
       <RowDefinition Height="Auto" /> 
      </Grid.RowDefinitions> 

      <Label Grid.Row="0" Content="Counters" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="10,0,0,0" /> 

      <DataGrid x:Name="CountersList" Grid.Row="1" HorizontalAlignment="Stretch" Margin="10,0,10,10" AutoGenerateColumns="False" VerticalAlignment="Stretch" 
        CanUserResizeColumns="True" CanUserReorderColumns="False" CanUserSortColumns="False" SelectionMode="Single" CanUserDeleteRows="False" 
        CanUserAddRows="False" CanUserResizeRows="False" SelectionUnit="FullRow" MouseDoubleClick="OnDoubleClick" HeadersVisibility="Column" > 
       <DataGrid.Columns> 
        <DataGridTextColumn Header="Name" IsReadOnly="True" Binding="{Binding Path=Name}" /> 
        <DataGridTextColumn Header="Path" IsReadOnly="True" Binding="{Binding Path=Path}" /> 
        <DataGridTextColumn Header="Count" IsReadOnly="True" Binding="{Binding Path=CountKey}" /> 
       </DataGrid.Columns> 
       <DataGrid.Resources> 
        <Style TargetType="{x:Type DataGridColumnHeader}"> 
         <Setter Property="Foreground" Value="Black" /> 
        </Style> 
       </DataGrid.Resources> 
      </DataGrid> 

      <Button Grid.Row="2" Content="Add" HorizontalAlignment="Left" Margin="10,0,0,10" VerticalAlignment="Bottom" Width="60" Click="addCounter" /> 
      <Button Grid.Row="2" Content="Remove" HorizontalAlignment="Left" Margin="75,0,0,10" VerticalAlignment="Bottom" Width="60" Click="removeCounter" /> 
      <Button Grid.Row="2" Content="-" HorizontalAlignment="Right" Margin="0,0,40,10" VerticalAlignment="Bottom" Width="25" Click="decrement" /> 
      <Button Grid.Row="2" Content="+" HorizontalAlignment="Right" Margin="0,0,10,10" VerticalAlignment="Bottom" Width="25" Click="increment" /> 
     </Grid> 

     <Grid x:Name="SoundsGrid" Grid.Column="2"> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="Auto" /> 
       <RowDefinition Height="*" /> 
       <RowDefinition Height="Auto" /> 
      </Grid.RowDefinitions> 

      <Label Grid.Row="0" Content="Sounds" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="10,0,0,0" /> 
      <Image Grid.Row="0" HorizontalAlignment="Right" Margin="0,8,110,0" VerticalAlignment="Top" Height="10" Width="10" > 
       <Image.Source> 
        <BitmapImage UriSource="volume.png" /> 
       </Image.Source> 
      </Image> 
      <Slider x:Name="Slider" Grid.Row="0" HorizontalAlignment="Right" VerticalAlignment="Bottom" Margin="0,0,10,5" Width="100" Maximum="100" Minimum="0" 
       AutoToolTipPlacement="BottomRight" IsMoveToPointEnabled="True" ValueChanged="volume" > 
       <Slider.LayoutTransform> 
        <ScaleTransform ScaleY="0.75" CenterX="15" CenterY="15"/> 
       </Slider.LayoutTransform> 
      </Slider> 

      <DataGrid x:Name="SoundsList" Grid.Row="1" HorizontalAlignment="Stretch" Margin="10,0,10,10" AutoGenerateColumns="False" VerticalAlignment="Stretch" 
        CanUserResizeColumns="True" CanUserReorderColumns="False" CanUserSortColumns="False" SelectionMode="Single" CanUserDeleteRows="False" 
        CanUserAddRows="False" CanUserResizeRows="False" SelectionUnit="FullRow" MouseDoubleClick="OnDoubleClick" HeadersVisibility="Column" > 
       <DataGrid.Columns> 
        <DataGridTextColumn Header="Name" IsReadOnly="True" Binding="{Binding Path=Name}" /> 
        <DataGridTextColumn Header="Path" IsReadOnly="True" Binding="{Binding Path=Path}" /> 
        <DataGridTextColumn Header="Key" IsReadOnly="True" Binding="{Binding Path=CountKey}" /> 
       </DataGrid.Columns> 
       <DataGrid.Resources> 
        <Style TargetType="{x:Type DataGridColumnHeader}"> 
         <Setter Property="Foreground" Value="Black" /> 
        </Style> 
       </DataGrid.Resources> 
      </DataGrid> 

      <Button Grid.Row="2" Content="Add" HorizontalAlignment="Left" Margin="10,0,0,10" VerticalAlignment="Bottom" Width="60" Click="addSound" /> 
      <Button Grid.Row="2" Content="Remove" HorizontalAlignment="Left" Margin="75,0,0,10" VerticalAlignment="Bottom" Width="60" Click="removeSound" /> 
      <Button Grid.Row="2" HorizontalAlignment="Right" Margin="0,0,40,10" VerticalAlignment="Bottom" Width="25" Height="22" Click="play" > 
       <Image Source="play.png" Width="8" Height="8" /> 
      </Button> 
      <Button Grid.Row="2" HorizontalAlignment="Right" Margin="0,0,10,10" VerticalAlignment="Bottom" Width="25" Height="22" Click="stop" > 
       <Image Source="stop.png" Width="8" Height="8" /> 
      </Button> 
     </Grid> 
    </Grid> 
</Grid> 
</Window> 

編輯:

上述解決方案並沒有解決分離器隱藏面板之一。要做到這一點,你需要添加一列每側:

  <ColumnDefinition Width="*" MinWidth="40" /> 
      <ColumnDefinition Width="*" MinWidth="0" /> 
      <ColumnDefinition Width="Auto" /> 
      <ColumnDefinition Width="*" MinWidth="0" /> 
      <ColumnDefinition Width="*" MinWidth="40" /> 

然後你需要移動網格和分流跨越兩列:

 <GridSplitter Margin="0,25,0,10" Grid.Column="2" ResizeBehavior="PreviousAndNext" Width="3" Padding="5"/> 

     <Grid x:Name="CountersGrid" Grid.Column="0" Grid.ColumnSpan="2"> 

     <Grid x:Name="SoundsGrid" Grid.Column="3" Grid.ColumnSpan="2"> 

這應該給你足以用於解決方案。您可能需要調整最小寬度以滿足您的需求。

+0

謝謝,但這並沒有真正的幫助,因爲您可以使用分隔符縮小列以使按鈕重疊或甚至完全隱藏列。 – user1869453

+0

啊,我不清楚這個問題。然後我會建議在每邊放置一個額外的列並在其上設置minSize。看我的編輯 –

0

我已經解決了該問題,方法是根據DataGrid列大小添加更新網格列和窗口MinWidth的代碼。現在窗口將停止調整從第二個DataGrid開始切割的位置。

void OnLayoutUpdated(object sender, EventArgs e) 
    { 
     double countersMinWidth = CountersList.Columns[0].ActualWidth + CountersList.Columns[1].ActualWidth + CountersList.Columns[2].ActualWidth + CountersList.Margin.Left + CountersList.Margin.Right; 
     double soundsMinWidth = SoundsList.Columns[0].ActualWidth + SoundsList.Columns[1].ActualWidth + SoundsList.Columns[2].ActualWidth + SoundsList.Margin.Left + SoundsList.Margin.Right; 
     if (countersMinWidth < 205) countersMinWidth = 205; 
     if (soundsMinWidth < 205) soundsMinWidth = 205; 
     Grid.ColumnDefinitions[0].MinWidth = countersMinWidth; 
     Grid.ColumnDefinitions[2].MinWidth = soundsMinWidth; 
     this.MinWidth = countersMinWidth + soundsMinWidth + Splitter.ActualWidth + 18; 
    } 
+0

你應該看看我的編輯。我認爲最好使用額外的兩列來完成此操作,而不是對可以調用__alot__的事件進行處理 –