2009-06-16 27 views

Trả lời

108

Vấn đề là Margin là thuộc tính và loại của nó (Thickness) là một loại giá trị. Điều đó có nghĩa là khi bạn truy cập thuộc tính, bạn sẽ nhận được bản sao của giá trị trở lại.

Mặc dù bạn có thể thay đổi giá trị của thuộc tính Thickness.Left cho một giá trị cụ thể (loại giá trị có thể biến đổi ... không thể tồn tại), nó sẽ không thay đổi lề.

Thay vào đó, bạn sẽ cần đặt thuộc tính Margin thành giá trị mới. Ví dụ (tình cờ cùng mã như Marc viết):

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

Là một lưu ý cho thiết kế thư viện, tôi đã có bao la ưa thích nó nếu Thickness là bất biến, nhưng với các phương pháp đó quay trở lại một giá trị mới mà là một bản sao của bản gốc, nhưng với một phần được thay thế. Sau đó, bạn có thể viết:

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

Không đáng lo ngại về hành vi kỳ lạ của các loại giá trị có thể thay đổi, đẹp và có thể đọc được, tất cả một biểu thức ...

+3

kudo để tra cứu loại thực tế ... Tôi thú nhận lừa dối với 'var' - ahem, xin lỗi; Tôi có nghĩa là "sử dụng một tính năng ngôn ngữ thích hợp" ;-p –

+1

Nó đã giúp thông báo lỗi chứa tên loại hoàn toàn đủ điều kiện. Với một đánh dấu nhanh cho MSDN, tôi chỉ cần "msdn System.Windows.FrameworkElement.Margin" trên thanh địa chỉ để đến đúng trang ... –

+0

tình cờ huh? ;) – zvolkov

5

Người ta sẽ đoán rằng (và WPF của tôi là một chút gỉ ngay bây giờ) mà Margin mất một đối tượng và không thể thay đổi trực tiếp.

ví dụ

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

Điều này không hoạt động: _'System.Windows.FrameworkElement.Margin 'là' thuộc tính 'nhưng được sử dụng giống như 'type'_ –

13

Margin đang trở lại một cấu trúc, có nghĩa là bạn đang chỉnh sửa một bản sao . Bạn sẽ cần một cái gì đó như:

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

MyControl.Margin = margin; – TheMissingLINQ

+0

(chúc mừng, cố định một số thời gian trước ... Tôi hy vọng bạn cần một trang làm mới ;-p) –

+1

Heh, nếu chỉ có chúng tôi đã có bản cập nhật nhận xét Ajax vì vậy tôi không giống như một công cụ ... – TheMissingLINQ

29

Thuộc tính Margin trả về một cấu trúc Thickness, trong đó Left là một tài sản. Tuyên bố là sao chép giá trị cấu trúc từ thuộc tính Margin và đặt giá trị thuộc tính Left trên bản sao. Bạn gặp lỗi vì giá trị bạn đặt sẽ không được lưu trữ trở lại thuộc tính Margin.

(phiên bản trước của C# sẽ chỉ cho phép bạn làm điều đó mà không phàn nàn, gây ra rất nhiều câu hỏi trong nhóm tin, diễn đàn về lý do tại sao một tuyên bố như vậy không ảnh hưởng gì cả ...)

Để thiết lập thuộc tính bạn sẽ cần phải nhận được cấu trúc Thickness từ Margin tài sản, thiết lập giá trị và lưu nó lại:

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

Nếu bạn đang đi để thiết lập tất cả các lề, chỉ cần tạo một cấu trúc Thickness và đặt chúng cùng một lúc:

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

Cảm ơn, tốt đẹp nhất. – MikeMalter

4

Để sử dụng Thickness bạn cần để tạo/thay đổi dự án phiên bản nền tảng .NET framework của bạn đến 4.5. bởi vì phương thức này chỉ có trong phiên bản 4.5. (Ngoài ra bạn chỉ có thể tải về PresentationFramework.dll và cung cấp cho referense để dll này, mà không cần tạo/thay đổi phiên bản .NET framework của bạn để 4.5.)

Nhưng nếu bạn muốn làm điều này đơn giản, Bạn có thể sử dụng mã này:

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

cũng

MyControl.Margin = new Padding(int all); 

Đây là đơn giản và không có nhu cầu bất kỳ thay đổi để dự án của bạn

0

Có một chút không rõ ràng bạn đang hỏi gì, nhưng để làm cho mọi việc trở nên thoải mái, bạn có thể kế thừa Kiểm soát của riêng bạn và thêm thuộc tính với mã mà Marc đề xuất:

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

Sau đó, trong mã khách hàng bạn có thể viết chỉ

MyImage img = new MyImage(); 
img.MarginLeft = 10; 
MessageBox.Show(img.Margin.Left.ToString()); // or img.MarginLeft 
+0

sử dụng thừa kế để giải quyết vấn đề đó? Khá lớn, phải không? – LuckyLikey

+0

@LuckyLikey nó phụ thuộc vào trường hợp sử dụng: nếu bạn có kế hoạch thay đổi 'MerginLeft' trên nhiều vị trí trong dự án, thừa kế tránh các vấn đề về thiết kế. Tất nhiên, nếu đây là một nơi duy nhất trong dự án của bạn, tôi sẽ chọn câu trả lời được chấp nhận. –

10

Người ta có thể chỉ cần sử dụng này

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

Phụ thuộc vào tình hình, bạn cũng có thể thử sử dụng tài sản đệm ở đây ...

MyControl.Margin=new Padding(0,0,0,0); 
Các vấn đề liên quan