Pergunta

Eu gostaria de criar um controle WPF para uma guia de janela, e eu quero que ele tem uma forma particular. Algo como isto;

      +------------------------------+
      |                              |
*     |                              |
      |                              |
   +--+                              +--+
6  |                                    |  6
   +------------------------------------+   
     6       stretching section       6

Assim, as pequenas abas no canto inferior esquerdo e inferior direito são tamanho fixo; 6x6, aproximadamente. Mas agora eu quero a seção central para esticar a largura de qualquer recipiente I tapa-lo em.

Eu estou usando um objeto Path no momento, mas eu não consigo descobrir como obter uma seção de alongamento, ou mesmo se Path é o caminho certo a seguir.

Alguém pode sugerir a melhor maneira de criar esse tipo de forma de meia-elástica?

Foi útil?

Solução

Eu fiz a parte de alongamento em meu aplicativo, criando um "StretchStackPanel" que herda de StackPanel. Os olhares de classe como este:

public class StretchStackPanel : StackPanel
{
    public static DependencyProperty StretchDependencyProperty = DependencyProperty.Register("Stretch", typeof(StretchMode), typeof(StretchStackPanel));

    protected override Size MeasureOverride(Size availableSize)
    {
        var baseSize = base.MeasureOverride(availableSize);

        if (availableSize.Width != double.PositiveInfinity && (Stretch & StretchMode.Horizontal) == StretchMode.Horizontal )
        {
            baseSize.Width = availableSize.Width;    
        }
        if (availableSize.Height != double.PositiveInfinity && (Stretch & StretchMode.Vertical) == StretchMode.Vertical)
        {
            baseSize.Height = availableSize.Height;
        }

        return baseSize;
    }

    protected override Size ArrangeOverride(Size finalSize)
    {
        var baseSize = base.ArrangeOverride(finalSize);

        if ((Stretch & StretchMode.Horizontal) == StretchMode.Horizontal )
        {
            baseSize.Width = finalSize.Width;    
        }

        if ((Stretch & StretchMode.Vertical) == StretchMode.Vertical)
        {
            baseSize.Height = finalSize.Height;
        }
        return baseSize;
    }

    [Category("Layout")]
    public StretchMode Stretch
    {
        get
        {
            return (StretchMode)GetValue(StretchDependencyProperty);
        }
        set
        {
            SetValue(StretchDependencyProperty, value);
        }
    }
}

O que você quer é uma grade com 2 linhas. O conteúdo da linha superior deve tê-lo de horizontal conjunto de alinhamento para o centro. o conteúdo da linha de fundo deve ser um StretchStackPanel.

Outras dicas

Por que não criar dois widgets diferentes? Um para a secção central e outro para a seção elástica. Em seguida, colocá-los juntos em um outro recipiente para formar um controle unificado.

Eu acho que você deve substituir o método MeasureOverride em seu controle e obter DesiredSize do seu conteúdo (chamando o método Medida em conteúdo / crianças). Depois, você pode criar o seu caminho com base neste tamanho.

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