2009-05-10 4 views
11

Tôi mới dùng lập trình .NET và cố gắng tìm hiểu Silverlight 2/C#.Cách chia sẻ hằng số giữa xaml và C# trong silverlight

Tôi cần khai báo hằng số (hoặc tốt hơn, các biến chỉ đọc) và truy cập chúng trong cả XAML và tệp C#-behind-behind của tôi.

Các giá trị này được xác định một cách thích hợp hơn trong XAML, nhưng nếu định nghĩa cần được thực hiện trong C#, thì tốt hơn so với mã hóa cứng giá trị ở một vài nơi.

Tôi đã tìm thấy giải pháp cho WPF XAML, nhưng Silverlight dường như không hỗ trợ cú pháp (và giải pháp mà tôi tìm thấy bắt buộc phải có định nghĩa trong tệp C#).

TIA!

Trả lời Michael

tôi thêm trả lời này như một bình luận cho câu hỏi ban đầu của tôi bởi vì trình biên tập comment không cho phép tôi để thêm văn bản nhiều này và tôi không thể tìm thấy một cách khác để đáp ứng cho câu trả lời của bạn.

Cảm ơn câu trả lời, Michael, nhưng tôi dường như không thể làm cho nó hoạt động.

Tôi bắt đầu bằng ví dụ từ "Pro Silverlight 2 in C# 2008". Ví dụ này hoạt động tốt, nhưng yêu cầu tôi mã hóa cứng hai giá trị giống nhau ở hai vị trí trong XAML của tôi và một vị trí trong C# của tôi.

Tôi đã triển khai giải pháp của bạn và mọi thứ được xây dựng tốt, nhưng khi tôi cố gắng thực thi mã, tôi gặp lỗi trang trong trình duyệt. Tôi đã xóa tất cả các thay đổi và xác minh rằng mọi thứ một lần nữa chạy tốt.

Sau đó tôi đã thêm khai báo xmlns: sys và sys: Int32 vào tệp App.xaml của tôi. Tất cả mọi thứ một lần nữa chạy tốt, nhưng khi tôi đã cố gắng để xem các tập tin Page.xaml trong VS2008, tôi đã nhận một lỗi lạ:

tiền tố chưa khai báo [Dòng: 6 Vị trí: 30] - Page.xmal, Dòng 1, Cột 1

Trang xem trước bị để trống.

Chẳng có gì thú vị trên dòng 6, Col 30 của Page.xaml, nhưng trong file App.xaml, vị trí có chứa đóng “>” ngay trước khi giá trị số nguyên 8:

<sys:Int32 x:Key="QAPS">8</sys:Int32> 

Nếu Tôi nhấn F5, tuy nhiên, ứng dụng chạy tốt trong trình duyệt.

Tôi đang chạy VS2008 SP1 và bộ công cụ Silverlight ngày 09 tháng 3.

Tôi không thể hiểu tại sao tuyên bố QAPS trong phần tài nguyên ứng dụng App.xaml có thể gây ra, đặc biệt là do tôi không tham chiếu đến nó ở bất cứ đâu trong ứng dụng. Bạn có bất cứ ý tưởng gì có thể xảy ra?

Một Trả lời Michael

Bạn đang đúng, tôi đã không thêm xmlns: khai sys để Page.xaml của tôi, nhưng thêm nó làm cho không có sự khác biệt - tôi vẫn nhận được những 'không khai báo tiền tố [Line: 6 Position: 30] 'trong Page.xaml (và ứng dụng vẫn chạy). Kể từ khi tất cả mọi thứ chạy OK, tôi đoán đây phải là một vấn đề trong VS2008.

Vấn đề lớn hơn là tôi đã nhận được ngoại lệ thời gian chạy khi cố gắng truy cập QAPS từ C# và tôi đã tìm ra những gì tôi đã làm sai khi gây ra lỗi đó. Vấn đề là tôi dường như đang truy cập tài nguyên trước khi nó tồn tại.

Tôi đã khai báo/khởi tạo biến riêng tư để giữ giá trị tài nguyên ở cấp lớp; khi tôi chuyển khởi tạo cho trình xử lý sự kiện, vấn đề đã biến mất. Vì vậy, tôi đoán rằng các biến cấp lớp C# được đánh giá trước khi các tài nguyên XAML được tạo.

(Ngoài ra, giới hạn 600 ký tự trên nhận xét là một nỗi đau thực sự. Vì vậy, tôi phải chỉnh sửa câu hỏi ban đầu của mình để đăng câu trả lời).

+0

gì XAML trông giống như cho Page.xaml của bạn. Bạn có thể bỏ qua khai báo không gian tên xmlns: sys trên page.xaml của mình. –

Trả lời

19

Đặt chúng trong ứng dụng hoặc trang web của bạn nguồn:

<Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:sys="clr-namespace:System;assembly=mscorlib"> 
    <Application.Resources> 
     <sys:Int32 x:Key="QPS">8</sys:Int32> 
    </Application.Resources> 
</Application> 

Sau đó, bạn có thể truy cập chúng thông qua mã như thế này:

if (Application.Current.Resources.Contains("QPS")) 
{ 
    int callsPerSecond = (int) Application.Current.Resources["QPS"]; 
} 

và thông qua XAML như thế này

<TextBlock Text="{StaticResource QPS}"/> 
+0

Kể từ XAML 2009, định nghĩa tài nguyên của bạn sẽ là ' 8'. Điều này áp dụng cho Windows 8 và Windows Phone 8.1. Tham khảo http://msdn.microsoft.com/en-us/library/ee792002(v=vs.110).aspx. – danhbear