Wpf XAML中的按钮处理程序
我有一个简单的WPF布局任务,并希望尽可能避免代码落后 我有两个左右面板。当我关闭左面板时-右面板被拉伸。。。 这是我的xaml:Wpf XAML中的按钮处理程序,wpf,wpf-controls,Wpf,Wpf Controls,我有一个简单的WPF布局任务,并希望尽可能避免代码落后 我有两个左右面板。当我关闭左面板时-右面板被拉伸。。。 这是我的xaml: <Grid Name="gridContainer"> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="
<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>
我想知道,有没有办法避免后面的代码?并且只在XAML中完成这个任务
感谢您的建议您可以使用命令和MVVM模式消除代码隐藏。您可以在视图模型中具有可见性属性,这些属性将是绑定到XAML元素的数据 然后使用命令,可以将单击事件路由到视图模型中的命令。这里有一篇关于WPF中可靠的命令模式的快速文章。
使用这种方法,您可以消除XAML代码落后,并在执行命令时对视图模型的行为进行单元测试。您可以这样做,而不需要代码落后 首先,我们需要设置一个特定的样式,允许我们为
堆栈面板
切换可见性
<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>
将按钮
更改为切换按钮
,并为其指定名称
<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>
左手边
关闭左面板
俗话说,“仅仅因为你可以,并不一定意味着你应该”;)不过说真的,MVVM真的可以帮到你。谢谢你的回答。但问题不在于MVVM,而在于WPF和XAML。此类任务必须在XAML或代码隐藏(视图部分)中完成。我不能将此任务归类为表示逻辑并将其移动到视图模型中,这是更多的交互逻辑,必须在视图中进行。这很酷,我只是想提出这个模式,并提到作为最佳实践,它有助于单元测试逻辑,即“如果X发生,那么Y应该发生,取决于X的值”。luckI的优点是,我强烈建议您也考虑使用MVVM模式。在这种情况下,这很好,因为它非常简单,但是如果您开始添加更多的逻辑,您应该使用一些更高级的逻辑,或者至少将其移动到自定义依赖项中。
<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>