带有 GridSplitter 的 WPF 扩展器

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/19516904/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-13 09:55:30  来源:igfitidea点击:

WPF Expander with GridSplitter

c#.netwpfxaml

提问by Ilya Solovyev

In my WPF window (.NET 4.0) I have Grid with two columns: stretched textbox (or whatever) on the left side and Expander on the right. Also in Expander I have GridSplitter, which is intended to resize both left and right columns when Expander is expanded. But it doesn't work.

在我的 WPF 窗口 (.NET 4.0) 中,我有两列网格:左侧的拉伸文本框(或其他)和右侧的 Expander。同样在扩展器中,我有 GridSplitter,它旨在在扩展器展开时调整左右列的大小。但它不起作用。

This is my XAML code:

这是我的 XAML 代码:

<Window x:Class="WpfApplication10.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
<Grid ShowGridLines="True" >
    <Grid.ColumnDefinitions>
        <ColumnDefinition />
        <ColumnDefinition Width="Auto" Name="column"/>
    </Grid.ColumnDefinitions>

    <TextBox Grid.Column="0" HorizontalAlignment="Stretch" TextWrapping="Wrap" 
             Text="TextBox" VerticalAlignment="Stretch" Background="Aqua"/>

    <Expander Grid.Column="1" Header="Expander" ExpandDirection="Left" 
              HorizontalAlignment="Right" Background="LightBlue" >
        <Expander.Content>
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="5"/>
                    <ColumnDefinition Width="Auto"/>
                </Grid.ColumnDefinitions>

                <TextBlock Text="Some text Some text Some Text" Grid.Column="1"/>
                <GridSplitter Grid.Column="0" Width="5"    
                              ResizeBehavior="PreviousAndCurrent"
                              ResizeDirection="Columns" 
                              HorizontalAlignment="Stretch"/>
            </Grid>
        </Expander.Content>
    </Expander>
</Grid></Window>


Appropriate solution is found. XAML:

找到了合适的解决方案。XAML:

<Window x:Class="WpfApplication10.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">

<Window.Resources>
    <BooleanToVisibilityConverter x:Key="BoolToVisConverter"/>
</Window.Resources>

<Grid ShowGridLines="True">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*" Name="leftColumn"/>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition Width="Auto" Name="rightColumn" />
    </Grid.ColumnDefinitions>

    <TextBox Grid.Column="0"
             HorizontalAlignment="Stretch"
             TextWrapping="Wrap"
             Text="TextBox"
             VerticalAlignment="Stretch"
             Background="Aqua" />

    <Expander Grid.Column="2"
              Name="Expander"
              Header="Expander"
              ExpandDirection="Left"
              Background="LightBlue" 
              Collapsed="Expander_Collapsed" 
              Expanded="Expander_Expanded" >
        <TextBlock Text="Some text Some text Some Text" />
    </Expander>
    <GridSplitter Grid.Column="1"
                  Width="5"
                  ResizeBehavior="PreviousAndNext"
                  ResizeDirection="Columns"
                  VerticalAlignment="Stretch"
                  Height="Auto" 
                  Visibility="{Binding ElementName=Expander, Path=IsExpanded, 
                              Converter={StaticResource BoolToVisConverter}}"/>
</Grid></Window>

Code-behind:

代码隐藏:

    private void Expander_Collapsed(object sender, RoutedEventArgs e)
    {
        leftColumn.Width = new GridLength(1, GridUnitType.Star);
        rightColumn.Width = new GridLength(1, GridUnitType.Auto);
    }

    private void Expander_Expanded(object sender, RoutedEventArgs e)
    {
        rightColumn.Width = new GridLength(1, GridUnitType.Star);
    }

采纳答案by XAMeLi

Your grid splitter works on the inner grid (in expander) and not on the main grid. Try this:

您的网格拆分器适用于内部网格(在扩展器中)而不是主网格。尝试这个:

<Window x:Class="WpfApplication10.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow"
        Height="350"
        Width="525">
    <Grid ShowGridLines="True">
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition Width="5" />
            <ColumnDefinition Width="Auto"
                              Name="column" />
        </Grid.ColumnDefinitions>

        <TextBox Grid.Column="0"
                 HorizontalAlignment="Stretch"
                 TextWrapping="Wrap"
                 Text="TextBox"
                 VerticalAlignment="Stretch"
                 Background="Aqua" />

        <Expander Grid.Column="2"
                  Header="Expander"
                  ExpandDirection="Left"
                  Background="LightBlue">
            <TextBlock Text="Some text Some text Some Text" />
        </Expander>
        <GridSplitter Grid.Column="1"
                      Width="5"
                      ResizeBehavior="PreviousAndNext"
                      ResizeDirection="Columns"
                      VerticalAlignment="Stretch"
                      Height="Auto" />
    </Grid>
</Window>

Now you'd need to handle what happens to the last column when the user expands/collapses the expander.

现在您需要处理当用户展开/折叠扩展器时最后一列发生的情况。

回答by saurabh.mridul

Try this, if it helps to resolve your problem.

试试这个,如果它有助于解决您的问题。

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
<Grid ShowGridLines="True" >
    <Grid.ColumnDefinitions>
        <ColumnDefinition />
        <ColumnDefinition Width="Auto" Name="column"/>

    </Grid.ColumnDefinitions>

    <TextBox Grid.Column="0" HorizontalAlignment="Stretch" TextWrapping="Wrap" 
         Text="TextBox" VerticalAlignment="Stretch"/>

    <Expander Grid.Column="1" Header="Expander" ExpandDirection="Left" 
          HorizontalAlignment="Right">
        <Expander.Content>
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="5"/>
                    <ColumnDefinition Width="Auto"/>
                </Grid.ColumnDefinitions>

                <TextBlock Text="Some text Some text Some Text" Grid.Column="0"/>
                <GridSplitter Grid.Column="1" Width="5"    
                          ResizeBehavior="PreviousAndCurrent"
                          ResizeDirection="Columns" 
                          HorizontalAlignment="Stretch"/>
            </Grid>
        </Expander.Content>
    </Expander>
</Grid>