2011-01-28 31 views
5

Tại sao tính năng này không hoạt động?Nội dung mặc định của Silverlight ContentPresenter Content

Trong generic.xaml cho một điều khiển tùy chỉnh:

Trong phong cách áp dụng cho các điều khiển tùy chỉnh ...

<Setter Property="ChromeContent"> 
    <Setter.Value> 
    <Grid /> 
    </Setter.Value> 
</Setter> 

...

Sau đó, trong các mẫu kiểm soát ...

<ContentPresenter Grid.Column="0" 
    x:Name="ChromeContentPresenter" 
    Content="{TemplateBinding ChromeContent}" /> 

Đây là phụ thuộc chuyên nghiệp perty cho ChromeContent ...

public Object ChromeContent 
{ 
    get { return (Object)GetValue(ChromeContentProperty); } 
    set { SetValue(ChromeContentProperty, value); } 
} 
public static readonly DependencyProperty ChromeContentProperty = 
    DependencyProperty.Register("ChromeContent", typeof(Object), 
    typeof(casPopup), null); 

Như bạn có thể thấy, cần có bất kỳ đối tượng nào. Tôi đã thử thay đổi nó thành một Lưới, nhưng điều đó không giúp được gì.

Nó ném lỗi này (từ javascript): _Failed để gán cho bất động sản 'System.Windows.Controls.ContentPresenter.Content'

Nhưng kỳ lạ, những điều sau đây sẽ làm việc tốt nếu tôi loại bỏ các Grid từ setter NĐ chỉ văn bản sử dụng:

<Setter Property="ChromeContent" Value="DEFAULT" /> 

Ngoài ra, điều này sẽ làm việc quá từ phương pháp OnApplyTemplate trong lớp điều khiển:

Grid g = new Grid(); 
    g.Width = 100; 
    g.Height = 25; 
    g.Background = new SolidColorBrush(Colors.LightGray); 
    ChromeContent = g; 

tôi đang gặp một thời gian khó khăn under tanding những gì đang ngăn chặn các nội dung mặc định của một mạng lưới, được định nghĩa trong generic.xaml từ làm việc. Có ai có bất kỳ kiến ​​thức về vấn đề này?

Rất cám ơn trước sự giúp đỡ của bạn!

Trả lời

6

Đây là vấn đề: -

<Setter Property="ChromeContent"> 
    <Setter.Value> 
    <Grid /> 
    </Setter.Value> 
</Setter> 

Bạn không nên bao gồm một UIElement trực tiếp trong một cuốn từ điển tài nguyên hoặc là một giá trị của một phong cách. Bạn có thể thấy phong cách như là một loại mô tả nhưng nó không phải là. Các giá trị trong một kiểu được xây dựng các thể hiện của các đối tượng mà chúng nắm giữ. Phong cách của bạn giữ một phiên bản Grid. Bất cứ khi nào kiểu đó được sử dụng để gán cho thuộc tính ChromeContent, nó sẽ cố gắng để cùng một ví dụ riêng lẻ của Lưới.

A UIElement chỉ có thể là con của một phụ huynh. Điều gì sẽ xảy ra nếu hai trường hợp kiểm soát của bạn được xây dựng? Sẽ có (nếu silverlight cho phép bạn) là một nỗ lực để chỉ định cùng một duy nhất thể hiện của Lưới cho cả hai điều khiển.

Đây là một lý do cho các mẫu như ControlTemplateDataTemplate. Đánh dấu bên trong các lệnh này được gọi mỗi lần mẫu được sử dụng thay vì khi Xaml được phân tích cú pháp đầu tiên.

Sửa:

Để trả lời bạn câu hỏi bổ sung, bạn nên mặc một loại tài sản của DataTemplate: -

<Setter Property="ChromeContentTemplate"> 
    <Setter.Value> 
    <DataTemplate> 
     <Grid /> 
    </DataTemplate> 
    </Setter.Value> 
</Setter> 

tài sản: -

public Object ChromeContentTemplate 
{ 
    get { return (DataTemplate)GetValue(ChromeContentTemplateProperty); } 
    set { SetValue(ChromeContentTemplateProperty, value); } 
} 

public static readonly DependencyProperty ChromeContentTemplateProperty= 
    DependencyProperty.Register("ChromeContentTemplate", typeof(DataTemplate), 
    typeof(casPopup), null); 

kiểm soát mẫu: -

<ContentPresenter Grid.Column="0" 
    x:Name="ChromeContentPresenter" 
    Content="{TemplateBinding ChromeContent}" 
    ContentTemplate="{TemplateBinding ChromeContentTemplate" /> 
+0

Wow, rất thú vị. Tôi không biết điều này. Một câu hỏi tiếp theo nếu tôi có thể: Làm thế nào tôi sẽ làm điều này với Mẫu Điều khiển? Khi tôi cố gắng đánh dấu mặc định trong ContentPresenter, tôi không thể thêm những thứ như lưới và như vậy. Tôi muốn nội dung của người dùng ghi đè tôi nếu họ cung cấp nội dung đó, vì vậy tôi không chắc chắn nên đi đâu từ đây. – maulkye

+0

OK. Cảm ơn rất nhiều vì sự giúp đỡ của bạn! – maulkye

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