Pergunta

Eu estou tendo alguns problemas para obter este para o trabalho em um aplicativo WPF que eu estou trabalhando. Basicamente, o que eu estou atrás é algo como painel de tarefas em uma MMC:

  • O aplicativo tem três colunas na parte principal da tela. Eu preciso de uma coluna no lado direito que é redimensionável. Eu presumo que isso significa usar uma grade com um GridSplitter mas qualquer coisa que as obras vão fazer.
  • Eu quero ser capaz de salvar a largura da coluna do lado direito quando o aplicativo é fechado e carregá-lo quando o aplicativo é aberto, mas isso deve ser um tamanho inicial:., O usuário deve ser capaz de redimensioná-la
  • Quando eu redimensionar a janela, eu quero que as colunas esquerda e do lado direito de permanecer do mesmo tamanho e a coluna do meio para redimensionar com a largura da janela.
  • As colunas esquerda e do lado direito precisa ter uma largura mínima. Quando eu redimensionar a coluna do lado direito Eu quero a coluna central para obter menor, mas não na coluna do lado esquerdo.
  • Eu também quero ser capaz de alternar a visibilidade da coluna do lado direito com um botão de alternância que está fora da coluna e quando ele retorna à visibilidade que eu quero que seja a mesma largura que era antes.

Eu estou tentando fazer o máximo possível em XAML e com a ligação.

E eu posso tê-lo coberto com creme, sorvete e pedaços de chocolate, por favor? : -)

Foi útil?

Solução

Enquanto eu lia suas necessidades, em vez de pensar de um Grid, eu acho que de uma DockPanel.

<DockPanel>
    <Grid Name="right"
        DockPanel.Dock="Right" MinWidth="100" />
    <Grid Name="Left"
        DockPanel.Dock="Left" MinWidth="100" />
    <Grid Name="middle" />
</DockPanel>

Se você fizer uma maneira de redimensionar right, então middle irá mudar à medida right é redimensionada. Se você redimensionar a janela, apenas a middle vai mudar. Armazenar e definir o Width de right é com você, mas não deve ser difícil.

Quanto permitindo que o usuário redimensionar right, que será um pouco mais complicado, mas eu achei este artigo que deve ajudar. Este outro artigo poderia ajudar ainda mais.

Para a visibilidade de right, você pode definir a sua Visibility para Collapsed para escondê-lo e restaurá-lo, definindo-o para Visible.

Nota: Os painéis dentro não tem que ser Grids, mas você vai querer usar algum tipo de Panel para cada um. Tudo o que você tem dentro de suas colunas Grid atuais deve funcionar muito bem.

Outras dicas

Eu usei uma grade com GridSplitters uma vez que este fez realmente fácil para redimensionar a coluna do meio, mantendo as larguras das colunas esquerda e direita.

XAML:

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="MainWindow"
    Title="Main Window"
    Width="640" Height="480">

    <Grid>
        <Grid.ColumnDefinitions>
            <!-- Left column -->
                <ColumnDefinition Width="200" MinWidth="100"/>
                <!-- Left GridSplitter column -->
                <ColumnDefinition Width="5"/>
                <!-- Center column. A width of * means the column will fill
                     any remaining space. -->
                <ColumnDefinition Width="*"/>
                <!-- Right GridSplitter column -->
                <ColumnDefinition x:Name="RightSplitterColumn" Width="5"/>
                <!-- Right column -->
                <ColumnDefinition x:Name="RightColumn" Width="200"
                                  MinWidth="100"/>
                </Grid.ColumnDefinitions>
                <GridSplitter Grid.Column="1" HorizontalAlignment="Stretch" />
                <GridSplitter Grid.Column="3" HorizontalAlignment="Stretch" />
                <Button x:Name="ToggleButton" Grid.Column="2"
                        Content="Toggle Right Column" Width="150" Height="25"
                        Click="ToggleButton_Click" />
    </Grid>
</Window>

Código-Behind

Quando se escondendo na coluna da direita, eu apenas definir a largura da coluna a 0 desde colunas de grade não tem uma propriedade de visibilidade.

public partial class MainWindow : Window
{
    private double rightColumnWidth;
    private double rightColumnMinWidth;
    private bool rightColumnHidden;

    public MainWindow()
    {
        this.InitializeComponent();
    }

    private void ToggleButton_Click(object sender, RoutedEventArgs e)
    {
        if (rightColumnHidden)
        {
            // Restore the widths.
            RightColumn.MinWidth = rightColumnMinWidth;
            RightColumn.Width = new GridLength(rightColumnWidth);
            RightSplitterColumn.Width = new GridLength(5);
        }
        else
        {
            // Remember the user-set widths for the columns.
            rightColumnWidth = RightColumn.Width.Value;
            rightColumnMinWidth = RightColumn.MinWidth;

            // Remember to set the minimum width to 0 before changing the actual
            // width.
            RightColumn.MinWidth = 0;
            RightColumn.Width = new GridLength(0);
            RightSplitterColumn.Width = new GridLength(0);
        }

        rightColumnHidden = !rightColumnHidden;
    }
}

Como para salvar e restaurar as larguras das colunas na inicialização, gostaria apenas de armazenar as variáveis ??de largura para um arquivo de configurações e aplicá-las quando o seu aplicativo for reaberto.

Defina a ColumnDefinition Largura para Auto e colocar um controle dentro dessa coluna e dar Star para as outras colunas. Sempre que você quiser ocultar a coluna com o conteúdo, defina o control.Visibility = Collapsed e desde coluna largura é Auto, você não vai ver essa coluna e as colunas restantes terá o espaço.

3 anos mais tarde, você pode encontrar uma outra abordagem sobre CodeProject.

http://www.codeproject.com/ artigos / 437237 / WPF-Grid-Column-and-Row-Hiding

Ele adiciona uma propriedade "Visible" para definições coluna personalizada.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top