2010-06-14 3 views
9

Bu oldukça belirsiz bir şey, sadece çok basit bir şey eksik olabilir.WPF kaynaklarını diğer kaynak etiketlere atama

<LinearGradientBrush x:Key="GridRowSelectedBackBrushGradient" StartPoint="0,0" EndPoint="0,1"> 
    <GradientStop Color="#404040" Offset="0.0" /> 
    <GradientStop Color="#404040" Offset="0.5" /> 
    <GradientStop Color="#000000" Offset="0.6" /> 
    <GradientStop Color="#000000" Offset="1.0" /> 
</LinearGradientBrush> 

Sonra çok sonraları, ben bir DataGrid için HighlightBrushKey geçersiz kılmak istiyorum:

Senaryo 1

benim <Window.Resources> bölümünde böyle bir degrade fırça oluşturmak düşünelim. Ben bunu basitçe yaptım (korkunç);

<LinearGradientBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" 
        GradientStops="{Binding Source={StaticResource GridRowSelectedBackBrushGradient}, Path=GradientStops}" 
        StartPoint="{Binding Source={StaticResource GridRowSelectedBackBrushGradient}, Path=StartPoint}" 
        EndPoint="{Binding Source={StaticResource GridRowSelectedBackBrushGradient}, Path=EndPoint}" /> 

Bu, bir kaynağa başvurmanın en kaygan yoludur. Ben de hemen hemen aynı olan aşağıdaki problemi buldum. Ben üzerinde ConverterParameter besleyen bir Array, bunları tedarik etmek isteyen sonradan Sonra

<SolidColorBrush x:Key="DataGridRowBackgroundBrush" Color="#EAF2FB" /> 
<SolidColorBrush x:Key="DataGridRowBackgroundAltBrush" Color="#FFFFFF" /> 

: Senaryo 2

benim <Window.Resources> işaretlemesinde iki renk oluşturdu şöyle Say Bir Bağlayıcı böylece benim statik kaynak örnekleri ile özel Dönüştürücü sağlayabilmektedir:

<Setter Property="Background"> 
    <Setter.Value> 
     <Binding RelativeSource="{RelativeSource Mode=Self}" 
       Converter="{StaticResource BackgroundBrushConverter}"> 
      <Binding.ConverterParameter> 
       <x:Array Type="{x:Type Brush}"> 
        <SolidColorBrush Color="{Binding Source={StaticResource DataGridRowBackgroundBrush}, Path=Color}" /> 
        <SolidColorBrush Color="{Binding Source={StaticResource DataGridRowBackgroundAltBrush}, Path=Color}" /> 
       </x:Array> 
      </Binding.ConverterParameter> 
     </Binding> 
    </Setter.Value> 
</Setter> 

Ne yaptım e varolan bir kaynağa başvurma girişimidir, ancak çabalarımda aslında kaynağı yeniden oluşturdum ve özellikleri eşleştirdik. Yine, bu ideal değil.

Şimdi bu soruna en az iki kez vurdum, daha iyi bir yolu var mı? Birlikte çalıştığınız biçimlendirme yeterince yukarı gitmez

Teşekkürler Tom

cevap

10

Birinin bunun hakkında ne isteyeceğini merak ediyordum.

Senaryo 1'de yapmak istediğiniz şey, tek bir kaynağı "takma ad" etkin bir şekilde vermek. Bu, sadece gördükten sonra bariz görünen belirteçle kolayca yapılır.

<ResourceDictionary> 
    <StaticResourceExtension x:Key="{x:Static SystemColors.HighlightBrushKey}" 
          ResourceKey="GridRowSelectedBackBrushGradient" /> 
</ResourceDictionary> 

bu ilk ResourceDictionary fırça nesnesini arar ve aynı ekler:

<ResourceDictionary> 
    <LinearGradientBrush x:Key="GridRowSelectedBackBrushGradient" ... /> 
</ResourceDictionary> 

sadece başka ResourceDictionary bir takma adı, dahil etmek için: yere bizim App.xaml içinde ya da biz bu olduğunu varsayalım Yeni bir anahtar altındaki ikinci ResourceDictionary nesnesine. Bu ayrıca bir ResourceDictionary içinde çalışır.çözelti 2 için senaryo için

kadar basittir:

<Binding.ConverterParameter> 
    <x:Array Type="{x:Type Brush}"> 
    <StaticResourceExtension ResourceKey="DataGridRowBackgroundBrush" /> 
    <StaticResourceExtension ResourceKey="DataGridRowBackgroundAltBrush" /> 
    </x:Array> 
</Binding.ConverterParameter> 

Yine ResourceKey ile bulunan gerçek Brush nesneleri Brush[] diziye doğrudan ilave edilir. Yeni Brush oluşturulmadı.

Sanırım hepimiz, StaticResourceExtension işaretleme uzantısı sözdizimini (örn. {StaticResource Xyz}) kullanmak için çok kullandığımızın, aynı zamanda düzenli öğe sözdizimi ile de kullanılabileceğini unutmak kolay olduğunu düşünüyorum.

+0

Evet, Ray bu kadar! Biraz benim için xaml ile üzülmeme izin verin ve nasıl devam edeceğimi size bildiririm. Benim bildiğim kadarıyla, bu cevap! Teşekkürler! – Tom

+0

Tamam, Window.Resources kendisinin bir ResourceDictionary olduğu gibi, ben sadece benim botched kaynak kopyaları StaticResourceExtension ile değiştirdim ve sadece çalışır. Bu sihir, çok teşekkür ederim. – Tom

+1

Bu işe yaramazsa, geçici ve geçici derleyici hatalarını artırır: "System.Windows.StaticResourceExtension" türünde bir nesne, "System.Windows.Media.Color" türünü bekleyen bir özelliğe uygulanamaz. Bunlar gelir ve gider - bazen bir yapıdan sonra da devam eder ve birbiri ardına kaybolurlar. –

0

. İlk örneğiniz olan LinearGradientBrush'u oluşturmazsınız: sadece kaynağa başvurursunuz. Örneğin: İkinci örnekte

<DataGrid HighlightBrushKey="{StaticResource GridRowSelectedBackBrushGradient}" .... 

, sana bir kaynak olarak diziyi bildirmek istiyorum söyleyebilirim:

<x:Array Type="{x:Type Brush}" x:Key="MyArray"> 
    <SolidColorBrush Color="#EAF2FB" /> 
    <SolidColorBrush Color="#FFFFFF" /> 
</x:Array> 

Sonra da kullanabilirsiniz

<Binding RelativeSource="{RelativeSource Mode=Self}" 
     Converter="{StaticResource BackgroundBrushConverter}" 
     ConverterParameter="{Staticresource MyArray}" /> 
+0

Teşekkürler Dan! Ancak, DataGrid'de HighlightBrushKey adı verilen bir özellik yoktur, x: Statik sistem fırçasını geçersiz kılan DataGrid.Resources bölümünde ayrılmalıdır. Diziyi bir kaynak olarak tanımlamayı düşündüm, ancak daha önce oluşturduğum SolidColorBrushes'a başvurmak yerine, aynı SolidColorBrush kaynaklarını iki kez tanımlamayı gerektiriyor. Aradığım şey büyük olasılıkla mevcut değil, neredeyse bir tip yapısı olurdu. Sadece bunun üstesinden gelmek ve devam etmeliyiz! – Tom