Pergunta

MyControl.Margin.Left = 10;

Erro:

Não é possível modificar o valor de retorno de 'System.Windows.FrameworkElement.Margin' porque ele não é uma variável

Foi útil?

Solução

O problema é que Margin é uma propriedade, e seu tipo ( Thickness ) é uma tipo de valor. Isso significa que quando você acessa o imóvel que você está recebendo um Copiar do valor de volta.

Mesmo que você pode alterar o valor do Thickness.Left propriedade para um valor particular (GRR ... tipos de valores mutáveis ??não deveria existir), isso não mudaria a margem.

Em vez disso, você precisa definir a propriedade Margin para um novo valor. Por exemplo (coincidentemente o mesmo código como Marc escreveu):

Thickness margin = MyControl.Margin;
margin.Left = 10;
MyControl.Margin = margin;

Como uma nota para o projeto de biblioteca, eu teria muito preferido que Thickness eram imutáveis, mas com métodos que retornaram um novo valor que era uma cópia do original, mas com uma parte substituída. Em seguida, você poderia escrever:

MyControl.Margin = MyControl.Margin.WithLeft(10);

Sem se preocupar com comportamento estranho de tipos de valores mutáveis, agradável e legível, tudo o que a expressão ...

Outras dicas

A propriedade Margin retorna uma estrutura Thickness, dos quais Left é uma propriedade. O que a declaração faz é copiar o valor estrutura da propriedade Margin e definindo o valor da propriedade Left na cópia. Você recebe um erro porque o valor que você definir não serão armazenados de volta para a propriedade Margin.

(As versões anteriores do C # seria apenas deixar você fazer isso sem reclamar, causando uma série de perguntas em newsgroups e fóruns sobre o porquê de uma declaração como essa não teve nenhum efeito em tudo ...)

Para definir a propriedade que você precisa para obter a estrutura Thickness da propriedade Margin, definir o valor e armazená-lo de volta:

Thickness m = MyControl.Margin;
m.Left = 10;
MyControl.Margin = m;

Se você estiver indo para definir todas as margens, basta criar uma estrutura Thickness e pô-los todos de uma vez:

MyControl.Margin = new Thickness(10, 10, 10, 10);

Margin está retornando uma estrutura, o que significa que você está editando um cópia . Você vai precisar de algo como:

var margin = MyControl.Margin;
margin.Left = 10;
MyControl.Margin = margin;

Pode-se simplesmente usar este

MyControl.Margin = new System.Windows.Thickness(10, 0, 5, 0);

Um diria que (e meu WPF é um direito pouco enferrujado agora) que a margem leva um objeto e não pode ser alterado diretamente.

exemplo

MyControl.Margin = new Margin(10,0,0,0);

Para usar Thickness você precisa criar / alterar o seu projecto versão da plataforma .NET framework para 4,5. becaus este método disponível apenas na versão 4.5. (Além disso, você pode apenas baixar PresentationFramework.dll e dar referense a esta dll, sem criar / alterar a sua versão .NET framework para 4,5.)

Mas se você quiser fazer este simples, você pode usar este código:

MyControl.Margin = new Padding(int left, int top, int right, int bottom);

também

MyControl.Margin = new Padding(int all);

Este é simples e não precisa de qualquer alteração ao seu projecto

Depende da situação, você também pode tentar usar propriedade estofamento aqui ...

MyControl.Margin=new Padding(0,0,0,0);

= Margem nova espessura (0, 0, 0, 0);

É um pouco claro o que você está pedindo, mas para tornar as coisas confortável, você pode herdar o seu próprio controle e adicionar uma propriedade com o código que Marc sugere:

class MyImage : Image {
    private Thickness thickness;
    public double MarginLeft {
        get { return Margin.Left; }
        set { thickness = Margin; thickness.Left = value; Margin = thickness; }
    }
}

Em seguida, no código do cliente que você pode escrever apenas

MyImage img = new MyImage();
img.MarginLeft = 10;
MessageBox.Show(img.Margin.Left.ToString()); // or img.MarginLeft
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top