2017-01-20 58 views
1

私は分割したい私のインターフェイス(WPFを使用)に2つの領域があります。水平と垂直の分割を切り替えるボタン。私は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が必要な場合、私は次のことを示唆している:BoolConverterはIValueConverterをある

<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> 

。コードの後ろに:

private bool _layoutHorizontal = true; 
public bool LayoutHorizontal 
{ 
    get { return _layoutHorizontal; } 
    set 
    { 
     _layoutHorizontal = value; 
     NotifyPropertyChanged(); 
    } 
} 
関連する問題