2009-03-12 28 views
13

Tôi không thể làm việc này trong Silverlight, vì vậy tôi đã tạo hai dự án thử nghiệm. Một dự án WPF đơn giản và một dự án Silverlight đơn giản mà cả hai chỉ làm một việc: thiết lập một biến đọc công khai tĩnh trong mã, và sử dụng nó trong một XAML xương hoàn toàn trống rỗng. Trong WPF, các công trình không bị cản trở. Trong Silverlight, tôi nhận được cảnh báo trình biên dịch và thời gian chạy lỗi sau:Sử dụng các đối tượng tĩnh trong XAML đã được tạo trong mã trong Silverlight

Cảnh báo 2 Thẻ 'tĩnh' không tồn tại trong không gian tên XML 'http://schemas.microsoft.com/winfx/2006/xaml ...

thuộc tính không hợp lệ value {x: Static SilverlightApplication3: Page.Test} cho văn bản thuộc tính. [Dòng: 7 Vị trí: 25]

Tôi giả định rằng điều này không được hỗ trợ trong Silverlight 2, hoặc tôi chỉ thiếu một cái gì đó thực sự đơn giản? Dưới đây là đoạn code đầy đủ cho cả hai chỉ trong trường hợp đó là thứ hai:

public partial class Window1 : Window 
{ 
    public static readonly string Test = "test"; 
    public Window1() 
    { 
     InitializeComponent(); 
    } 
} 

<Window x:Class="WpfApplication4.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="300" Width="300" 
     xmlns:WpfApplication4="clr-namespace:WpfApplication4">  
    <Grid> 
     <TextBlock Text="{x:Static WpfApplication4:Window1.Test}" /> 
    </Grid> 
</Window> 

và đây là phiên bản SL:

public partial class Page : UserControl 
    { 
     public static readonly string Test = "test"; 
     public Page() 
     { 
      InitializeComponent(); 
     } 
    } 

<UserControl x:Class="SilverlightApplication3.Page" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:SilverlightApplication3="clr-namespace:SilverlightApplication3" 
    Width="400" Height="300"> 
    <Grid x:Name="LayoutRoot" Background="White"> 
     <TextBlock Text="{x:Static SilverlightApplication3:Page.Test}" /> 
    </Grid> 
</UserControl> 

Trả lời

5

Thật không may, nó trông giống như Silverlight không hỗ trợ ràng buộc thuộc tính tĩnh: What is the {x:Static sdfsdf} equivalent?

+2

Điều đó thật tệ. Cảm ơn các liên kết mặc dù. Tôi đã không tìm thấy bất cứ điều gì dứt khoát khi tôi tìm kiếm, nhưng người trả lời trong bài bạn liên kết là một cơ quan trên SL – Rich

+2

WhyTF không hỗ trợ họ ?! –

6

Thật không may Silverlight có nhiều giới hạn về chức năng và bạn chỉ tìm thấy một trong số chúng. StaticMarkupExpression không được SL2 hỗ trợ. Bạn cũng không thể tự xác định nó.

ví dụ: anh chàng từ ms: http://blogs.msdn.com/edmaia/archive/2008/11/23/animating-objects-visibility-in-silverlight.aspx

Bí quyết có thể được sử dụng một đối tượng như

class Helper{ 
    public string Value {get{return Page.Test;}} 

// implement INotifyPropertyChange if you want updates 
} 

Và sau đó

<Grid.Resources> 
    <somexmlns:Helper x:Key="Helper"/> 
</Grid.Resources> 

<TextBlock Text="{Binding Value, Source={StaticResource Helper}}"/> 
+0

Điều đó làm việc tuyệt vời như trong ví dụ của bạn với một chuỗi đơn giản, nhưng khi tôi cố gắng sử dụng một đối tượng Màu hoặc một chuỗi biểu diễn của một màu, nơi tôi có thể mã cứng một trong XAML (GradientStop Color = "# FAF6 ...), Tôi nhận được lỗi sau: AG_E_PARSER_BAD_PROPERTY_VALUE Các giới hạn là gì? – Rich

+0

Sử dụng cú pháp đầy đủ: Chuỗi không phải là đối tượng Màu, do đó bạn không thể gán nó cho một.Nhưng nếu bạn sử dụng cú pháp khung góc đầy đủ, bạn có thể chỉ định một đối tượng * màu * và nó sẽ hoạt động tốt. Hoặc, sử dụng một máy phát điện như Blend và có một cái nhìn vào cách nó đánh dấu các thuộc tính có chứa các đối tượng màu trong cú pháp viết tắt. –

+0

'public static string Value {get {return Page.Test;}}' cũng hoạt động –

3

Bạn thực sự có thể liên kết với thuộc tính tĩnh miễn là lớp không phải là một tĩnh lớp học. Vì vậy, sử dụng ví dụ trước của lớp Người trợ giúp:

public class Helper 
{ 
    public static string Value{ get {return Page.Test;} } 
} 

XAML sẽ giữ nguyên.

+0

Hi Sam, nó sẽ thông báo cho ràng buộc nếu giá trị 'Page.Test' đã được cập nhật chưa? –

+0

Hmmm, tôi không thể làm việc đó. Cú pháp xaml là gì, bạn có thể thêm nó vào đây –

1

Tôi vừa nhận thấy rằng bạn có câu hỏi phụ về ràng buộc với màu sắc. Tôi không nghĩ rằng nó có thể được thực hiện trong Silverlight. Tôi khá chắc chắn rằng yêu cầu tối thiểu cho một mục tiêu ràng buộc trong Silverlight là FrameworkElement.

+0

Vâng ... và nhìn vào nó bây giờ vài tháng sau, nếu tôi muốn gắn kết với những gì tôi nghĩ là một màu vì tôi có thể khai báo nó như một chuỗi hex, nó thực sự là một đối tượng cọ khi tất cả được nói và làm. Tôi thậm chí không nhớ dự án nào tôi đã hỏi câu hỏi này, nhưng nếu tôi cần phải làm điều đó ngay bây giờ, tôi sẽ tưởng tượng rằng điều này sẽ làm việc nếu tôi tiếp xúc với một đối tượng Brush tĩnh thay vì một màu hoặc chuỗi đại diện của một màu. – Rich

-2

Một đối tượng tĩnh sẽ được khởi tạo chỉ một lần và sẽ tiếp tục cho đến cuối chương trình. Đối tượng tĩnh có thể giữ trạng thái của nó ngay cả khi nó không nằm trong phạm vi, nhưng chỉ hiển thị trong phạm vi cục bộ của chúng.

+2

Chỉ cần bạn hiểu tại sao câu trả lời đúng của bạn đã được bỏ phiếu tiêu cực, chúng ta không nói về từ khóa tĩnh trong ngôn ngữ phái sinh C, chúng ta đang nói về việc sử dụng trong XAML của lớp StaticExtension. theo nghĩa câu trả lời của bạn mô tả. –

Các vấn đề liên quan