首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPF -使用Stackpanel

WPF -使用Stackpanel
EN

Stack Overflow用户
提问于 2014-12-17 12:12:58
回答 3查看 484关注 0票数 0

在我的WPF窗口中,我有一个状态栏和一个TextBox。现在,我想要实现的是在我的代码,我有一个按钮,折叠和显示状态栏。当我单击该按钮时,状态栏会折叠,因此控件将为collapsed,不再显示,因此文本框将填充状态栏的空间。当再次按下按钮时,状态栏将是visible,并将文本框向上推。

我只试过这个,但没成功。THe问题是状态栏将隐藏,但文本框仍然位于相同的位置,不会占用空间。请有人帮我,这将是非常感谢。

代码语言:javascript
复制
<StackPanel>
<Grid>
    <StatusBar Height="30" VerticalAlignment="Bottom">
        <StatusBarItem Content="Last Saved Not Saved"/>
        <StatusBarItem HorizontalAlignment="Right">
            <StackPanel Orientation="Horizontal">
                <StatusBarItem  Content="Character 0 Word 0"/>
                <StatusBarItem Content="Ln 1, Ch 0"/>
            </StackPanel>
        </StatusBarItem>
    </StatusBar>
    <TextBox x:Name="textBox" Height="380" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Margin="0,24,0,0"/>
</Grid>
</StackPanel>
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-12-17 13:14:12

正如我们前面所说的,为了实现TextBox拉伸的功能,您可以使用DockPanel,如下所示:

代码语言:javascript
复制
<DockPanel MinHeight="380" LastChildFill="True">
    <StatusBar DockPanel.Dock="Top" Height="30"/>
    <TextBox DockPanel.Dock="Bottom"/>
</DockPanel>

还有其他的方法,比如使用Grid.RowsDefinitions,但是为了这段对话,让我们继续使用DockPanel

编码愉快。

票数 1
EN

Stack Overflow用户

发布于 2014-12-17 12:26:39

我相信你想要的是:

可以绑定到ToggleButton上的ToggleButton属性,通过使用转换器,将IsChecked布尔值转换为可见性,下面是转换器类:

代码语言:javascript
复制
public class BooleanToVisibilityConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        bool val = (bool)value;

        return val ? System.Windows.Visibility.Visible : System.Windows.Visibility.Collapsed;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return null;
    }
}

这是XAML:

代码语言:javascript
复制
<Window x:Class="test.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:YourNamespace="clr-namespace:YourNamespace"
    Title="MainWindow" Height="350" Width="525">
<Window.Resources>
    <YourNamespace:BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/>
</Window.Resources>
<Grid>
    <StackPanel>
        <ToggleButton Name="toggle" Width="100" Height="24" Content="Toggle It"/>

        <StatusBar Height="30" VerticalAlignment="Bottom"
                   Visibility="{Binding ElementName=toggle, Path=IsChecked, Converter={StaticResource BooleanToVisibilityConverter}}">
            <StatusBarItem Content="Last Saved Not Saved"/>
            <StatusBarItem HorizontalAlignment="Right">
                <StackPanel Orientation="Horizontal">
                    <StatusBarItem  Content="Character 0 Word 0"/>
                    <StatusBarItem Content="Ln 1, Ch 0"/>
                </StackPanel>
            </StatusBarItem>
        </StatusBar>
        <TextBox x:Name="textBox" Height="380" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Margin="0,24,0,0"/>
    </StackPanel>
</Grid>

我建议在换流器上阅读一下。

票数 0
EN

Stack Overflow用户

发布于 2014-12-17 12:56:36

检查一下这个:

代码语言:javascript
复制
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="25"/>
            <RowDefinition x:Name="rowHeight" Height="*"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <ToggleButton Name="toggle" Width="100" Height="24" Content="Toggle It"/>
        <TextBox x:Name="textBox" TextWrapping="Wrap" Text="TextBox" Grid.Row="1" Grid.RowSpan="{Binding ElementName=toggle, Path=IsChecked, Converter={StaticResource GridSpanConverter}}"/>
        <StatusBar Height="30" VerticalAlignment="Bottom" Grid.Row="2"
               Visibility="{Binding ElementName=toggle, Path=IsChecked, Converter={StaticResource BooleanToVisibilityConverter}}">
            <StatusBarItem Content="Last Saved Not Saved"/>
            <StatusBarItem HorizontalAlignment="Right">
                <StackPanel Orientation="Horizontal">
                    <StatusBarItem  Content="Character 0 Word 0"/>
                    <StatusBarItem Content="Ln 1, Ch 0"/>
                </StackPanel>
            </StatusBarItem>
        </StatusBar>
    </Grid>

您需要如下所示的转换器:

代码语言:javascript
复制
    <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/>
    <local:GridSpanConverter x:Key="GridSpanConverter"/>

GridSpanConverter代码:

代码语言:javascript
复制
public class GridSpanConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value is bool && (bool)value == true)
            return 1;
        return 2;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return value;
    }
}

在这里,您必须使用您的命名空间在窗口中添加本地程序集引用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27525374

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档