2013-09-04 64 views
5

Tôi đã một nguồn tài nguyên quy định tại XAML của tôi:Tại sao tôi không thể đặt giá trị tài nguyên SolidColorBrush từ mã?

<core:WidgetBase xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk" x:Class="....Silverlight.LiquidityConstraintsView" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:core="clr-namespace:...Silverlight;assembly=....Silverlight" 
    xmlns:local="clr-namespace:....Silverlight" 
    mc:Ignorable="d"> 

    <core:WidgetBase.Resources> 
     <SolidColorBrush x:Key="..." /> 
    </core:WidgetBase.Resources> 
... 

Tôi cố gắng để thiết lập nó từ mã:

void _administrationClient_GetByFilterModuleSettingCompleted(object sender, GetByFilterModuleSettingCompletedEventArgs e) 
{ 
     this.Resources["..."] = new SolidColorBrush(Colors.Red); 
} 

Nhưng tôi nhận được lỗi:

Phương pháp hay hoạt động là không được thực hiện.

stack trace:

at System.Windows.ResourceDictionary.set_Item(Object key, Object value) 
    at ....Silverlight.LiquidityConstraintsView._administrationClient_GetByFilterModuleSettingCompleted(Object sender, GetByFilterModuleSettingCompletedEventArgs e) 
    at ....Service.AdministrationServiceClient.OnGetByFilterModuleSettingCompleted(Object state) 

Nó xảy ra khi tôi gửi đi một yêu cầu đến một máy chủ để lấy cho tôi một màu, sau đó khi nó trả tôi cố gắng và thiết lập màu cho tài nguyên, nó không thành công ngay cả khi Tôi thử và đặt màu đỏ vào thời điểm đó.

Nếu điều đó giúp, phương pháp mà tôi thiết lập đây là một phương thức gọi lại không đồng bộ từ cuộc gọi WCF đến máy chủ.

+1

nó nên làm việc .. tôi đã cố gắng nó ở cuối của tôi nó works.Where chính xác được bạn thiết lập giá trị này, bạn có thể chia sẻ một số mã khác? – Nitin

+0

Tôi đồng ý, lỗi không khớp với hành động điển hình này. Chúng ta có thể có một stacktrace? –

+2

Có lẽ điều này là do thực tế là: 'Silverlight không hỗ trợ tài nguyên động. Tất cả các tham chiếu tài nguyên đến các tài nguyên có khóa trong XAML đều là static.' Liên kết trên [MSDN] (http://msdn.microsoft.com/en-us/library/cc903925 (VS.95) .aspx). –

Trả lời

7

Nếu bạn nhìn vào các setter cho ResourceDictionary trong Reflector (đối với Silverlight), bạn sẽ thấy nó ném một NotImplementedException, do đó, điều này sẽ không hoạt động trong Silverlight.

Bạn có thể thử xóa tài nguyên và thêm lại, nhưng đó là ảnh chụp trong bóng tối.

+0

Thật là điên rồ khi Silverlight không hỗ trợ điều đó, nhưng cách giải quyết của bạn hoạt động ... – sprocket12

0

Thao tác này sẽ làm việc như mong đợi nếu bạn thử nó trong một ứng dụng WPF mới:

<Window.Resources> 
    <SolidColorBrush x:Key="Brush" Color="Aqua" /> 
</Window.Resources> 

public MainWindow() 
{ 
    this.Resources["Brush"] = new SolidColorBrush(Colors.Green); 
    InitializeComponent(); 
} 

Vì vậy, tôi đề nghị với bạn rằng vấn đề của bạn nằm ở đâu đó.

CẬP NHẬT >>>

Làm thế nào về việc tránh vấn đề này hoàn toàn và chỉ cần sử dụng một tài sản public trong MainWindow.xaml.cs của bạn?

Trong MainWindow.xaml.cs:

public SolidColorBrush Brush { get; set; } 

Sau đó, bất cứ nơi nào trong ứng dụng của bạn, bạn nên có thể truy cập tài sản này như thế này:

((MainWindow)App.Current.MainWindow).Brush = new SolidColorBrush(Colors.Red); 
+0

Có, tôi đã thử nó trong một ứng dụng WPF tươi và nó hoạt động, nhưng tôi đang sử dụng Silverlight có lẽ nó làm cho một sự khác biệt. – sprocket12

+0

Có, tôi có thể sử dụng một tài sản công cộng, chỉ có vấn đề với điều đó là tôi cần màu này có sẵn để được trong một IValueConverter ... – sprocket12

+0

Xin vui lòng xem cập nhật mới nhất của tôi trong câu trả lời của tôi. – Sheridan

3

"Việc lập chỉ mục này thực hiện cụ thể chặn việc sử dụng" bộ ".Nếu bạn cố gắng đặt giá trị bằng cách sử dụng trình chỉ mục, một ngoại lệ sẽ được ném. Bạn phải xóa và thêm lại vào ResourceDictionary để thay đổi khóa-giá trị đôi."

http://msdn.microsoft.com/en-us/library/ms601221(v=vs.95).aspx