Como alternar a visibilidade da coluna WPF grade
-
10-07-2019 - |
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? : -)
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 Grid
s, 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.