Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf XAML中的按钮处理程序_Wpf_Wpf Controls - Fatal编程技术网

Wpf XAML中的按钮处理程序

Wpf XAML中的按钮处理程序,wpf,wpf-controls,Wpf,Wpf Controls,我有一个简单的WPF布局任务,并希望尽可能避免代码落后 我有两个左右面板。当我关闭左面板时-右面板被拉伸。。。 这是我的xaml: <Grid Name="gridContainer"> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="

我有一个简单的WPF布局任务,并希望尽可能避免代码落后

我有两个左右面板。当我关闭左面板时-右面板被拉伸。。。 这是我的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>
我想知道,有没有办法避免后面的代码?并且只在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>