2012-03-28 65 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