【问题标题】:WPF - Using StackpanelWPF - 使用堆栈面板
【发布时间】:2014-12-17 21:14:12
【问题描述】:

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

我只试过这个,但没有用。问题是状态栏会隐藏,但文本框仍会在同一个位置并且不会占用空间。有人请帮助我,将不胜感激。

<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>

【问题讨论】:

  • 您是否尝试过改用DockPanel?那里面没有Grid。您必须使用DockPanel.Dock 将控件设置在正确的位置。另一件事是在DockPanel 上使用Height 属性而不是TextBox,这样TextBox 就会伸展。 HTH
  • 我必须摆脱网格吗?而是用 DOCKPANEL 替换 GRID 和 STACKPANEL?
  • 看起来像这样:&lt;DockPanel MinHeight="380" LastChildFill="True"&gt;&lt;StatusBar DockPanel.Dock="Top" Height="30"/&gt;&lt;TextBox DockPanel.Dock="Bottom"/&gt;。这是我的头等大事,所以你可能想稍微调整一下,但你应该明白了。
  • 像男人一样甜蜜! @XAMlMAX 看起来它完成了这项工作。
  • 如果你愿意,我会回答这个问题并告诉你一个不使用任何转换器的方法?

标签: wpf xaml stackpanel


【解决方案1】:

正如我们之前所说,要实现TextBox 的拉伸功能,您“可以”使用DockPanel,如下所示:

<DockPanel MinHeight="380" LastChildFill="True">
    <StatusBar DockPanel.Dock="Top" Height="30"/>
    <TextBox DockPanel.Dock="Bottom"/>
</DockPanel>

还有其他方法,即使用Grid.RowsDefinitions,但为了这次对话,让我们坚持使用DockPanel
编码愉快。

【讨论】:

    【解决方案2】:

    我相信你在这之后:

    您可以绑定到 ToggleButton 上的 IsChecked 属性,并使用转换器将 IsChecked 布尔值转换为 Visibility,这是转换器类:

    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:

    <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>
    

    我建议阅读converters

    【讨论】:

    • 我认为 OP 已经完成了该功能,即隐藏和显示,问题在于 xaml 本身,不允许 TextBox 占用其余空间。
    • @Mike 不需要创建 BooleanToVisibilityConverter,因为微软已经为它提供了 .net 框架。参考这个链接msdn.microsoft.com/en-us/library/…
    【解决方案3】:

    检查一下:

        <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>
    

    您需要一些转换器,如下所示:

        <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/>
        <local:GridSpanConverter x:Key="GridSpanConverter"/>
    

    GridSpanConverter 代码:

    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;
        }
    }
    

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

    【讨论】:

      猜你喜欢
      • 2011-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-24
      • 2012-12-07
      • 1970-01-01
      相关资源
      最近更新 更多