2014-12-17 4 views
0

В моем окне WPF у меня есть строка состояния и текстовое поле. Теперь, что я хочу достичь, в моем коде, у меня есть кнопка, которая рушится и показывает строку состояния. Когда я нажимаю на кнопку, строка состояния сжимается, поэтому элемент управления будет collapsed и больше не отображается, и поэтому текстовое поле заполняет пространство строки состояния. Когда кнопка снова будет нажата, строка состояния будет visible и вытолкнет текстовое поле вверх.WPF - Использование Stackpanel

Я пробовал только это, но это не сработало. Проблема в том, что строка состояния будет скрыта, но текстовое поле все равно будет находиться в одном месте и не займет пространство. Кто-то, пожалуйста, помогите мне, что было бы очень признательно.

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

Вы пытались использовать 'DockPanel' вместо этого? Это без 'Grid' внутри. Вам нужно будет использовать 'DockPanel.Dock' для установки элементов управления в правильных местах. Другое свойство use 'Height' в' DockPanel', а не 'TextBox', таким образом, TextBox будет растягиваться. HTH – XAMlMAX

+0

Должен ли я избавиться от сетки? и вместо этого замените GRID и STACKPANEL с помощью DOCKPANEL? – Zer0

+1

Это будет выглядеть так: ''. Это из головы, так что вы можете немного подстроить его, но вы должны получить эту идею. – XAMlMAX

ответ

1

Как мы говорили раньше, чтобы достичь функциональность TextBox растяжку, вы «могли бы» использовать DockPanel, например, так:

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

Есть и другие способы, то есть с помощью Grid.RowsDefinitions, но ради этого разговора давайте придерживайтесь DockPanel.
Счастливое кодирование.

0

Я считаю, что вы после этого:

Вы можете привязать к IsChecked собственности на ToggleButton, и с помощью конвертера, преобразовать логическое IsChecked к видимости, здесь есть класс преобразователя:

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.

+1

Я думаю, что у OP есть эта функциональность, т. Е.скрытие и показ, проблема заключается в том, что он сам, не позволяя «TextBox» занимать остальную часть пространства. – XAMlMAX

+0

@Mike Не нужно создавать BooleanToVisibilityConverter, потому что Microsoft уже предоставила его .net framework. См. Эту ссылку http://msdn.microsoft.com/en-us/library/system.windows.controls.booleantovisibilityconverter(v=vs.110).aspx –

0

Проверьте это:

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

Здесь вы добавить локальный Referance сборки в окне с вашим пространством имен.

Смежные вопросы