Definindo propriedades de margem em código
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
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