2012-03-28 101 views
1

我有簡單的WPF佈局任務,並且希望儘可能避免代碼隱藏。XAML中的按鈕處理程序

我有兩個面板左右。當我colapsing左側面板 - 右側面板被拉伸...... 這是我的XAML:

 <Grid Name="gridContainer"> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="Auto"/> 
       <ColumnDefinition Width="5"/> 
       <ColumnDefinition Width="*"/> 
      </Grid.ColumnDefinitions> 

      <StackPanel Background="Aqua" Grid.Column="0" Name="leftPanel" > 
       <TextBlock FontSize="35" Foreground="#58290A" TextWrapping="Wrap">Left Hand Side</TextBlock> 
      </StackPanel> 

      <GridSplitter Name="leftSplitter" Grid.Column="1" HorizontalAlignment="Stretch"/> 

      <StackPanel Grid.Column="2" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> 
       <Label Content="... Clien Area .. Has to Stretch vertically and horizontally" Margin="10"></Label> 
       <Button Click="LeftButton_Click" Margin="10">Close Left Panel</Button>      
      </StackPanel> 
     </Grid> 

這是後臺代碼:

private void LeftButton_Click(object sender, RoutedEventArgs e) 
    { 
     if(leftPanel.Visibility == System.Windows.Visibility.Visible) 
     { 
      gridContainer.ColumnDefinitions[0].Width = GridLength.Auto; 
      leftPanel.Visibility = System.Windows.Visibility.Collapsed; 
      leftSplitter.Visibility = System.Windows.Visibility.Collapsed; 
     } 
     else 
     { 
      gridContainer.ColumnDefinitions[0].Width = GridLength.Auto; 
      leftPanel.Visibility = System.Windows.Visibility.Visible; 
      leftSplitter.Visibility = System.Windows.Visibility.Visible; 
     } 
    } 

我想知道,有什麼辦法避免這裏的代碼?並僅在XAML中實現此任務?

感謝意見

+0

俗話說,「只因爲你能,不一定意味着你應該」)儘管如此,MVVM真的可以幫助你。 – KodeKreachor 2012-03-28 19:40:31

回答

1

你可以這樣做,沒有代碼隱藏。

首先我們需要設置一個特定的樣式,這將允許我們切換visibilityStackPanel

<Window.Resources> 
    <Style x:Key="panelStyle" TargetType="{x:Type StackPanel}"> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding Path=Tag.IsChecked, RelativeSource={RelativeSource Self}}" Value="True"> 
       <Setter Property="StackPanel.Visibility" Value="Collapsed" /> 
      </DataTrigger> 
      <DataTrigger Binding="{Binding Path=Tag.IsChecked, RelativeSource={RelativeSource Self}}" Value="False"> 
       <Setter Property="StackPanel.Visibility" Value="Visible" /> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 
</Window.Resources> 

接下來我們對原始代碼做一些小的修改。

添加樣式並將StackPanelTag綁定到Button

<StackPanel Background="Aqua" Style="{StaticResource panelStyle}" Tag="{Binding ElementName=myButton}" Grid.Column="0" Name="leftPanel" > 

更改ButtonToggleButton並給它命名。

<ToggleButton Name="myButton" Margin="10">Close Left Panel</ToggleButton> 

它應該看起來像你這樣做了。

<Grid Name="gridContainer"> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="Auto"/> 
     <ColumnDefinition Width="5"/> 
     <ColumnDefinition Width="*"/> 
    </Grid.ColumnDefinitions> 

    <StackPanel Background="Aqua" Style="{StaticResource panelStyle}" Tag="{Binding ElementName=myButton}" Grid.Column="0" Name="leftPanel" > 
     <TextBlock FontSize="35" Foreground="#58290A" TextWrapping="Wrap">Left Hand Side</TextBlock> 

    </StackPanel> 

    <GridSplitter Name="leftSplitter" Grid.Column="1" HorizontalAlignment="Stretch"/> 

    <StackPanel Grid.Column="2" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> 
     <Label Content="... Clien Area .. Has to Stretch vertically and horizontally" Margin="10"></Label> 
     <ToggleButton Name="myButton" Margin="10">Close Left Panel</ToggleButton>   
    </StackPanel> 
</Grid> 
+0

我不得不說,我強烈建議你也考慮使用MVVM模式。在這種情況下,它很簡單,但是如果你開始添加更多的邏輯,你應該使用一些更高級的邏輯,或者至少把它移到一個自定義的依賴關係中。 – eandersson 2012-03-30 14:12:41

2

您可以消除背後使用指揮和MVVM模式代碼。您的視圖模型中可以有Visibility屬性,這些屬性將綁定到您的XAML元素。

然後使用命令可以將點擊事件路由到視圖模型中的命令。這裏有一個關於WPF中固定命令模式的快速文章。 What is the accepted pattern for WPF commanding in MVVM?

使用這種方法可以消除背後的XAML代碼,也可以很好地設置自己,以便在命令執行時單元測試視圖模型的行爲。

+0

感謝您的回答。但問題不在於MVVM,而在於WPF和XAML。這些任務必須在XAML或代碼隱藏(查看部分)中得到滿足。我無法將此任務歸類爲表示邏輯並將其移至視圖模型,這是更多交互邏輯,必須存在於View中。 – user1153896 2012-03-29 09:38:39

+0

這很酷,我只是想提出這種模式,並提出這是一個最佳實踐,它有助於能夠對單元測試邏輯進行說明,「如果X發生,那麼Y應該發生,這取決於X的價值是什麼」。祝你好運 – KodeKreachor 2012-03-29 12:23:05