代码之家  ›  专栏  ›  技术社区  ›  pmcilreavy

WPF SharedSizeGroup GridSplitter问题

  •  6
  • pmcilreavy  · 技术社区  · 15 年前

    我希望在顶层布局中使用网格。网格将有1列和N行。网格中的每一行还应包含一个网格,该网格应具有3列和1行。在第二列中是一个网格拆分器,我正在尝试使用一个sharedSizeGroup,这样就可以在所有嵌套网格中更改第一列的大小。

    这就是我所拥有的……而且它是有效的!!…好吧,有点……如果你点击拆分器,不放手就调整大小,那就可以了……但是出于某种原因,如果你调整了某个东西的大小,放开鼠标,然后尝试用另一行调整大小,那就好像“粘”了一样。

    有什么想法吗?

    <!-- Parent Grid -->
    <Grid Grid.IsSharedSizeScope="True">
        <Grid.RowDefinitions>
            <RowDefinition></RowDefinition>
            <RowDefinition></RowDefinition>
        </Grid.RowDefinitions>
    
        <!-- First Grid -->
        <Grid Grid.Row="0">
            <Grid.ColumnDefinitions>
                <ColumnDefinition SharedSizeGroup="A" Width="Auto"></ColumnDefinition>
                <ColumnDefinition SharedSizeGroup="B" Width="Auto"></ColumnDefinition>
                <ColumnDefinition SharedSizeGroup="C" Width="Auto"></ColumnDefinition>
            </Grid.ColumnDefinitions>
    
            <Label Grid.Column="0">One-Left</Label>
            <GridSplitter Grid.Column="1" Width="5" Background="DarkGray"></GridSplitter>
            <Label Grid.Column="2">One-Right</Label>
        </Grid>
    
        <!-- Second Grid -->
        <Grid Grid.Row="1">
            <Grid.ColumnDefinitions>
                <ColumnDefinition SharedSizeGroup="A" Width="Auto"></ColumnDefinition>
                <ColumnDefinition SharedSizeGroup="B" Width="Auto"></ColumnDefinition>
                <ColumnDefinition SharedSizeGroup="C" Width="Auto"></ColumnDefinition>
            </Grid.ColumnDefinitions>
    
            <Label Grid.Column="0">Two-Left</Label>
            <GridSplitter Grid.Column="1" Width="5" Background="DarkGray"></GridSplitter>
            <Label Grid.Column="2">Two-Right</Label>
        </Grid>
    
    </Grid>
    
    3 回复  |  直到 12 年前
        1
  •  10
  •   Marcin Wisnicki    12 年前

    我的答案来自 ms connect :

    通常,您可以通过不使用SharedSizeGroup来解决此问题,而是将所有共享大小绑定到一个对象(例如,您的DataContext)上的单个属性:

    <Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:my="clr-namespace:WpfApplication3"
            Height="350" Width="525" Title="MainWindow">
    
        <Window.DataContext>
            <my:MainWindowData Width0="1*" Width1="1*" />
        </Window.DataContext>
    
        <Window.Resources>
    
            <DataTemplate x:Key="dt">
             <Grid>
                <Grid.ColumnDefinitions>
                 <ColumnDefinition Width="{Binding Path=Width0, Mode=TwoWay}" />
                 <ColumnDefinition Width="Auto" />
                 <ColumnDefinition Width="{Binding Path=Width1, Mode=TwoWay}" />
                </Grid.ColumnDefinitions>
                <Button Grid.Column="0" Content="{Binding Width0}" />
                <GridSplitter Grid.Column="1" Width="10" ResizeBehavior="PreviousAndNext" ResizeDirection="Columns" />
                <Button Grid.Column="2" Content="{Binding Width1}" />
             </Grid>
            </DataTemplate>
    
        </Window.Resources>
    
        <StackPanel>
            <ContentPresenter Content="{Binding}" ContentTemplate="{StaticResource dt}" />
            <ContentPresenter Content="{Binding}" ContentTemplate="{StaticResource dt}" />
        </StackPanel>
    
    </Window>
    

    其中width0和width1是匹配类型(gridlength)。它可以与任何类型的大小(固定、星型和自动)结合使用。

    更新 :

    或者,也许更好,您可以完全在XAML中进行,而不是绑定到DataContext。只需定义一个带有命名列的主网格(不一定是父网格,但需要某种方法来引用它),然后按名称绑定到它们。

    <Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Height="350" Width="525" Title="MainWindow">
    
        <!-- shared sizing used only on fixed size columns therefore safe -->
        <!-- alternatively you can hardcode width of splitter column -->
        <Grid Name="masterGrid" Grid.IsSharedSizeScope="True">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="1*" Name="masterColumn0" />
                <ColumnDefinition Width="Auto" SharedSizeGroup="masterColumn1" />
                <ColumnDefinition Width="1*" Name="masterColumn2" />
            </Grid.ColumnDefinitions>
            <StackPanel Grid.ColumnSpan="3">
                <StackPanel.Resources>
                    <DataTemplate x:Key="dt">
                        <Grid>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="{Binding Path=Width, Mode=TwoWay, ElementName=masterColumn0}" />
                                <ColumnDefinition Width="Auto" SharedSizeGroup="masterColumn1" />
                                <ColumnDefinition Width="{Binding Path=Width, Mode=TwoWay, ElementName=masterColumn2}" />
                            </Grid.ColumnDefinitions>
                            <Button Grid.Column="0" Content="{Binding Path=Width, Mode=TwoWay, ElementName=masterColumn0}" />
                            <Button Grid.Column="2" Content="{Binding Path=Width, Mode=TwoWay, ElementName=masterColumn2}" />
                        </Grid>
                    </DataTemplate>
                </StackPanel.Resources>
                <ContentPresenter ContentTemplate="{StaticResource dt}" />
                <ContentPresenter ContentTemplate="{StaticResource dt}" />
            </StackPanel>
            <GridSplitter Grid.Column="1" Width="10" ResizeBehavior="PreviousAndNext" ResizeDirection="Columns" ShowsPreview="True" />
        </Grid>
    
    </Window>
    

    这增加了使用所有网格共享的单个网格拆分器的好处。

        2
  •  2
  •   Drew Marsh    15 年前

    我可以重新解释这个,老实说,它看起来像个虫子。具体来说,如果将列的宽度扩展到第一行,我就不能再将宽度减小到比另一行的宽度更大的程度。我想再试试这个,不过…不知道该怎么解决。

        3
  •  1
  •   punker76    13 年前

    如果你觉得可以的话,试试这个解决方案(在Kaxaml,它工作得很好)。

    <!-- Parent Grid -->
    <Grid Grid.IsSharedSizeScope="True">
    
      <Grid.RowDefinitions>
        <RowDefinition></RowDefinition>
        <RowDefinition></RowDefinition>
      </Grid.RowDefinitions>
    
      <Grid.ColumnDefinitions>
        <ColumnDefinition SharedSizeGroup="A" Width="Auto"></ColumnDefinition>
        <ColumnDefinition Width="Auto"></ColumnDefinition>
        <ColumnDefinition SharedSizeGroup="C" Width="Auto"></ColumnDefinition>
      </Grid.ColumnDefinitions>
    
      <Label Grid.Column="0" Grid.Row="0">One-Left</Label>
      <Label Grid.Column="0" Grid.Row="1">Two-Left</Label>
      <GridSplitter Grid.Column="1" Grid.Row="0" Grid.RowSpan="2" Width="5" Background="DarkGray"></GridSplitter>
      <Label Grid.Column="2" Grid.Row="0">One-Right</Label>
      <Label Grid.Column="2" Grid.Row="1">Two-Right</Label>
    
    </Grid>
    

    希望这有帮助