MyControl.Margin.Left = 10;
Lỗi:
Không thể sửa đổi giá trị trả về của 'System.Windows.FrameworkElement.Margin' vì nó không phải là một biến
Câu trả lời:
Vấn đề là đó Margin
là một thuộc tính, và kiểu ( Thickness
) của nó là một kiểu 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ị.
Mặc dù bạn có thể thay đổi giá trị của thuộc Thickness.Left
tính cho một giá trị cụ thể (không nên tồn tại các loại giá trị có thể thay đổi grr ...), nó sẽ không thay đổi lề.
Thay vào đó, bạn sẽ cần đặt thuộc Margin
tính thành một giá trị mới. Ví dụ (trùng hợp là mã giống như Marc đã viết):
Thickness margin = MyControl.Margin;
margin.Left = 10;
MyControl.Margin = margin;
Như một lưu ý cho thiết kế thư viện, tôi sẽ rất thích nó nếu Thickness
là bất biến, nhưng với các phương thức trả về giá trị mới là 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 phải lo lắng về hành vi kỳ quặc của các loại giá trị có thể thay đổi, đẹp và dễ đọc, tất cả một biểu thức ...
Các Margin
tài sản trả về một Thickness
cấu trúc, trong đó Left
là một tài sản. Những gì câu lệnh làm là sao chép giá trị cấu trúc từ thuộc Margin
tính và thiết lập Left
giá trị thuộc tính 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 Margin
tính.
(Các phiên bản trước của C # sẽ cho phép bạn làm điều đó mà không cần phàn nàn, gây ra rất nhiều câu hỏi trong các nhóm tin và diễn đàn về lý do tại sao một tuyên bố như vậy không có tác dụng gì cả ...)
Để đặt thuộc tính, bạn sẽ cần lấy Thickness
cấu trúc từ thuộc Margin
tính, đặt giá trị và lưu trữ lại:
Thickness m = MyControl.Margin;
m.Left = 10;
MyControl.Margin = m;
Nếu bạn định đặt tất cả các lề, chỉ cần tạo một Thickness
cấu trúc và đặt tất cả chúng cùng một lúc:
MyControl.Margin = new Thickness(10, 10, 10, 10);
Margin
đang trả về 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;
Người ta có thể đơn giản sử dụng cái này
MyControl.Margin = new System.Windows.Thickness(10, 0, 5, 0);
Người ta có thể đoán rằng (và WPF của tôi bây giờ hơi cũ) rằng Margin lấy 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);
Để sử dụng, Thickness
bạn cần tạo / thay đổi .NET framework
phiên bản nền tảng dự án của mình thành 4.5. vì phương pháp này chỉ có trong phiên bản 4.5. (Ngoài ra, bạn chỉ có thể tải xuống PresentationFramework.dll và cung cấp tham chiếu cho dll này mà không cần tạo / thay đổi .NET framework
phiên bản của bạn thành 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 thế
MyControl.Margin = new Padding(int all);
Điều này rất đơn giản và không cần bất kỳ thay đổi nào đối với dự án của bạn
Có một chút không rõ ràng bạn đang yêu cầu điều gì, nhưng để làm cho mọi thứ trở nên thoải mái, bạn có thể kế thừa Quyền kiểm soát của riêng mình và thêm một thuộc tính với mã mà Marc gợi ý:
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 chỉ có thể viết
MyImage img = new MyImage();
img.MarginLeft = 10;
MessageBox.Show(img.Margin.Left.ToString()); // or img.MarginLeft
MerginLeft
nhiều vị trí trong dự án, việc kế thừa sẽ tránh được 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.
var
- ahem, xin lỗi; Ý tôi là "sử dụng một đặc điểm ngôn ngữ thích hợp" ;-p