簡體   English   中英

WPF在水平和垂直拆分之間切換

[英]WPF switch between horizontal and vertical split

您能建議一種在wpf中在水平和垂直分割之間進行切換的好方法嗎? 我的界面中有兩個區域。 希望它們由可拖動的分隔符分隔,並有一個按鈕可以在水平分隔和垂直分隔之間切換。 我嘗試使用AvalonDock進行此操作,但由於某些原因無法正常工作。 這是我的問題,沒有人回答。 上一個

也許是另一個庫,還是使用標准GridSplitter做到這一點的簡單方法?

我只是遇到了類似的問題。 這是我的解決方法,這要歸功於這里的一些好主意:

<ContentControl>
    <ContentControl.Resources>
        <BoolConverter x:Key="BoolToLayoutConverter" TrueValue="templateHorizontal" FalseValue="templateVertical"/>
        <BoolConverter x:Key="BoolToLayoutCharacterConverter" TrueValue="—" FalseValue="|"/>
        <DataTemplate x:Key="mainTable">
            <StackPanel>
                <Label Content="MainTable goes here"/>
                <ToggleButton Content="{Binding LayoutHorizontal, Converter={StaticResource BoolToLayoutCharacterConverter}}" 
                        IsChecked="{Binding LayoutHorizontal}"/>
            </StackPanel>
        </DataTemplate>
        <DataTemplate x:Key="childTables">
            <Label Content="ChildTables go here"/>
        </DataTemplate>
    </ContentControl.Resources>
    <ContentControl.Style>
       <Style TargetType="ContentControl">
            <Style.Triggers>
                <DataTrigger Binding="{Binding LayoutHorizontal}" Value="False">
                    <Setter Property="ContentTemplate">
                        <Setter.Value>
                            <DataTemplate>
                                <Grid>
                                   <Grid.ColumnDefinitions>
                                        <ColumnDefinition/>
                                        <ColumnDefinition Width="10"/>
                                        <ColumnDefinition/>
                                    </Grid.ColumnDefinitions>
                                    <ContentPresenter Grid.Column="0" ContentTemplate="{StaticResource mainTable}"/>
                                    <GridSplitter Grid.Column="1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>
                                    <ContentPresenter Grid.Column="2" ContentTemplate="{StaticResource childTables}"/>
                                </Grid>
                            </DataTemplate>
                        </Setter.Value>
                    </Setter>
                </DataTrigger>
                <DataTrigger Binding="{Binding LayoutHorizontal}" Value="True">
                    <Setter Property="ContentTemplate">
                        <Setter.Value>
                            <DataTemplate>
                                <Grid>
                                    <Grid.RowDefinitions>
                                        <RowDefinition/>
                                        <RowDefinition Height="5"/>
                                        <RowDefinition/>
                                    </Grid.RowDefinitions>
                                    <ContentPresenter Grid.Row="0" ContentTemplate="{StaticResource mainTable}"/>
                                    <GridSplitter Grid.Row="1" Height="10" VerticalAlignment="Stretch" HorizontalAlignment="Stretch"/>
                                    <ContentPresenter Grid.Row="2" ContentTemplate="{StaticResource childTables}"/>
                                </Grid>
                            </DataTemplate>
                        </Setter.Value>
                    </Setter>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ContentControl.Style>
</ContentControl>

其中BoolConverter是IValueConverter。 以及后面的代碼:

private bool _layoutHorizontal = true;
public bool LayoutHorizontal
{
    get { return _layoutHorizontal; }
    set
    {
        _layoutHorizontal = value;
        NotifyPropertyChanged();
    }
}

我不知道在運行時重新定義網格的網格行和列的任何合理的干凈方法。 您將需要一些代碼來重新定義RowDefinitions和ColumnDefinitions,以及可能更新網格子級的Grid.Row和Grid.Column附加屬性。 我不確定網格對這種重新配置的響應程度如何。 您可能需要手動使某些東西無效。 我懷疑您嘗試使用的庫沒有實現重新配置網格所需的所有步驟,或者他們嘗試並發現它不起作用。

但是,將一個預配置的網格換成另一個應該相對簡單。 將兩個網格放在同一位置,並將當前未使用的網格的可見性設置為折疊。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM