2017-01-20 3 views
1

У меня есть две области на моем интерфейсе (с использованием WPF), которые я хочу разделить. И кнопка для изменения между горизонтальным и вертикальным расколом. Я использую AvalonDock. Когда я изменяю параметр Orientation в коде перед запуском, все это работает.Динамическое изменение горизонтального/вертикального смены с AvalonDock

<ad:DockingManager Grid.Row="1"> 
     <ad:LayoutRoot> 
      <ad:LayoutPanel x:Name="LayoutPanel1" Orientation="Vertical" IsMaximized="True"> 
       <ad:LayoutDocumentPane x:Name="DocPane1" ShowHeader="True"> 
        <ad:LayoutDocument Title="Spectrogram" CanClose="False" CanFloat="False"> 
         <wpf:CartesianChart Series="{Binding MySeries}" Zoom="X"/> 
        </ad:LayoutDocument> 
       </ad:LayoutDocumentPane> 
       <ad:LayoutDocumentPane x:Name="DocPane2" ShowHeader="True"> 
        <ad:LayoutDocument Title="Table" CanClose="False" CanFloat="False"> 
         <TextBox Name="textbox1" /> 
        </ad:LayoutDocument> 
       </ad:LayoutDocumentPane> 
      </ad:LayoutPanel> 
     </ad:LayoutRoot> 
    </ad:DockingManager> 

Но он не меняется при нажатии кнопки. Ничего не происходит, но когда я пытаюсь перетащить сплиттер, который остался на месте, программа вылетает.

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

Я отлаживал его, сама собственность менялась. Не знаю, в чем проблема ... Или, может быть, вы знаете лучший способ реализовать это, но мне тоже может понадобиться AvalonDock позже.

ответ

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(); 
    } 
} 
Смежные вопросы