2009-04-24 16 views
6

Kullanıcıları bir Renk Seçici iletişim kutusundan bir renk seçmelerine ve ardından uygulamanın stilini gerçek zamanlı olarak değiştirmelerine izin vererek uygulamanızı daha özelleştirilebilir hale getirmeye çalışıyorum (DynamicResource ile)WPF: Çalışma zamanı sırasında App.xaml'den Kaynaklar (renkler) değiştirme

app.xaml'da bulunan belirli kaynakları değiştirme konusunda nasıl geçerim?

var colorDialog = new CustomControls.ColorPickerDialog(); 
var dResult = colorDialog.ShowDialog(); 
var x = Application.Current.Resources.Values.OfType<LinearGradientBrush>().First(); 
x = new LinearGradientBrush(); 
x.GradientStops.Add(new GradientStop(colorDialog.SelectedColor,1)); 

Bu app.xaml dosyanın bir alıntı:

<Application.Resources> 
     <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0" x:Key="HeaderBackground"> 
      <GradientStop Color="#82cb02" Offset="1"/> 
      <GradientStop Color="#82cb01" Offset="0.2"/> 
      <GradientStop Color="#629a01" Offset="0.5"/> 
     </LinearGradientBrush> 

iyi nedir


bu ama hayır şans (sadece bir test) gibi bir şey denedim Bu formdaki özelleştirilebilirliğe (temel olarak sadece bazı renkleri değiştirerek) bir uygulamaya izin verme yolu?


Sadece sorulan bir önceki soruya this answer bulundu ve ancak Petoj verilen için yorum olarak bahsedilen aynı ınvalidoperationexception istisna alıyorum denedim

[Güncelleme] Cevap. İşte cevabı dan örnek kod:

Xaml:

<LinearGradientBrush x:Key="MainBrush" StartPoint="0, 0.5" EndPoint="1, 0.5" > 
    <GradientBrush.GradientStops> 
     <GradientStop Color="Blue" Offset="0" /> 
     <GradientStop Color="Black" Offset="1" /> 
    </GradientBrush.GradientStops> 
</LinearGradientBrush> 

C#:

LinearGradientBrush myBrush = FindResource("MainBrush") as LinearGradientBrush; 
myBrush.GradientStops[0].Color = Colors.Red; 

cevap

13

Bir çeşit ciltleme yapmaya çalışıyorsunuz gibi görünüyor mu?

Ayrı bir dosyada bulunan Kaynak Sözlüğündeki kaynakları tanımlamanızı öneririz. Ardından kodda bunu gibi kaynakları yükleyebilirsiniz (App.cs değiştirmek için daha sonra başka bir yerde, bir varsayılan yüklemek için):

//using System.Windows 
ResourceDictionary dict = new ResourceDictionary(); 
dict.Source = new Uri("MyResourceDictionary.xaml", UriKind.Relative); 

Application.Current.Resources.MergedDictionaries.Add(dict); 

Ayrıca App.xaml varsayılan kaynak sözlüğü tanımlamak ve kodunda sadece boşaltın olabilir ince.

Çalışma zamanında kullanmakta olduğunuz sözlüğü değiştirmek için MergedDictionaries nesnesini kullanın. Tüm arayüzü hızlı bir şekilde değiştirmek için bir cazibe gibi çalışır.

1

Eğer donmuş bir nesneyi değiştirmeye çalışıyoruz çünkü istisna olsun. Tüm uygulama seviyesi kaynakları, donabilir ve LinearGradientBrush ise otomatik olarak dondurulur. Pencere seviyesi gibi daha düşük bir seviyeye eklerseniz işe yarayacaktır.

+0

Ama bir pencere içine ekleyemiyorum çünkü bu stil projemdeki her pencereye uygulanıyor –

6

çalışma zamanındaki uygulama geniş kaynaklara değiştirme gibidir:

ınvalidoperationexception Hakkında
Application.Current.Resources("MainBackgroundBrush") = Brsh 

i WallStreet Programcı haklı sanırım. Belki de varolan bir fırçayı değiştirmeyi denememelisiniz, bunun yerine ihtiyacınız olan tüm gradyanların bulunduğu yeni bir fırça oluşturun ve bu yeni fırçayı uygulama kaynaklarına atayın.

bazı GradientStops rengini değiştirerek bir başka yaklaşım gibi uygulama geniş SolidColorBrushes için DynamicResource referans olarak bu renkleri tanımlamak için

:

<LinearGradientBrush x:Key="MainBrush" StartPoint="0, 0.5" EndPoint="1, 0.5" > 
<GradientBrush.GradientStops> 
    <GradientStop Color="{DynamicResource FirstColor}" Offset="0" /> 
    <GradientStop Color="{DynamicResource SecondColor}" Offset="1" /> 
</GradientBrush.GradientStops> 

ve ardından kullanmak

Application.Current.Resources["FirstColor"] = NewFirstColorBrsh 
Application.Current.Resources["SecondColor"] = NewSecondColorBrsh 

HTH

+0

Tam olarak istediğim bu. –

+0

Bunun, Silverlight'ta çalışmadığını unutmayın. DynamicResource' desteklenmiyor. – mbomb007

2

kullanınyöntem fırça (veya Storyboard gibi başka freezable nesne) derin bir kopyasını yapmak ve daha sonra kullanmak için:

LinearGradientBrush myBrush = FindResource("MainBrush") as LinearGradientBrush; 
myBrush = myBrush.Clone(); 
myBrush.GradientStops[0].Color = Colors.Red; 

@WallstreetProgrammer haklı - tüm uygulama düzeyinde kaynakları varsayılan olarak dondurulur.

Bu nedenle, önce nesneyi klonlamanız gerekir.

İlgili konular