使用AvalonDock进行动态水平/垂直分割更改

时间:2017-01-20 19:23:35

标签: c# wpf xaml user-interface avalondock

我的界面上有两个区域(使用WPF)我想要拆分。还有一个按钮可以在水平和垂直分割之间切换。我正在使用AvalonDock。当我在运行之前在代码中更改Orientation参数时,一切正常。

    private void OnChangeView(object sender, RoutedEventArgs e)
    {
        if (LayoutPanel1.Orientation == Orientation.Vertical) {
            LayoutPanel1.Orientation = Orientation.Horizontal;
        } else {
            LayoutPanel1.Orientation = Orientation.Vertical;
        }
    }

但是点击此处按钮不会改变。没有任何事情发生,但当我尝试拖动仍然存在的分离器时程序崩溃。

import pandas as pd, holoviews as hv, geoviews as gv, datashader as ds
from bokeh.models import WMTSTileSource
from holoviews.operation.datashader import datashade
hv.notebook_extension('bokeh')

df = pd.read_hdf('data/census.h5', 'census')
dataset = gv.Dataset(df, kdims=['meterswest', 'metersnorth'], vdims=['race'])

tiles = gv.WMTS(WMTSTileSource(url=\
'https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{Z}/{Y}/{X}.jpg'))

color_key = {'w':'blue', 'b':'green', 'a':'red', 'h':'orange', 'o':'saddlebrown'}

tiles * datashade(dataset, x_sampling=10, y_sampling=10, cmap=color_key,
                  element_type=gv.Image, aggregator=ds.count_cat('race'))

我调试了它,属性本身也发生了变化。不知道问题是什么...... 或许你知道一种更好的方法来实现它,但我也可能在以后需要AvalonDock。

1 个答案:

答案 0 :(得分:0)

我没有看过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();
    }
}