2010-10-07 18 views
6

Aşağıdaki kod, TemplatedParent'un Background.Color özelliğine GradientStop numaralı bağlantıyı bağlar. Her şey çalışıyor ama ben çıkış penceresinde bir bağlama hata alıyorum:Bağlama GradientStop çalışır ancak hata bildiriyor

System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=Background.Color; DataItem=null; target element is 'GradientStop' (HashCode=6944299); target property is 'Color' (type 'Color')

<Window 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
x:Class="WpfBindingTest.MainWindow" 
x:Name="Window" 
Title="MainWindow" 
Width="100" Height="100"> 
<Window.Resources> 
    <ControlTemplate x:Key="GradientTemplate" TargetType="{x:Type ContentControl}"> 
     <Border BorderThickness="1" BorderBrush="{TemplateBinding Background}"> 
      <Border.Background> 
       <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> 
        <GradientStop Color="{Binding Path=Background.Color, 
         RelativeSource={RelativeSource TemplatedParent}}" Offset="1"/> 
        <GradientStop Color="White" Offset="0"/> 
       </LinearGradientBrush> 
      </Border.Background> 
      <ContentPresenter/> 
     </Border> 
    </ControlTemplate> 
</Window.Resources> 

<Grid x:Name="LayoutRoot"> 
    <ContentControl Background="Green" Template="{StaticResource GradientTemplate}" > 
     <TextBlock VerticalAlignment="Center" HorizontalAlignment="Center" Text="X" /> 
    </ContentControl> 
</Grid> 
</Window> 
+0

yılında Neden arka planın kendisini, degradedeki belirli renge göre değil? –

+0

BorderBrushis ayrıca renge (katı) bağlanır; bu nedenle rengi yalnızca bir kez ayarlamak ve degradenin gradientstop için aynı rengi kullanmasını istiyorum. (Ve ayrıca çalışırken bir hata alıyorum neden bilmek istiyorum) – McCrille

cevap

1

Ben de Visual Studio konsol çıkışında aynı hata vardı. Eğer o zaman hatayı

alamadım bir LinearGradientBrush döndüren bir dönüştürücü kullanıyorsanız bunun için

olası açıklama ve geçici çözüm kodu bu

[ValueConversion(typeof(System.Windows.Media.Color), typeof(LinearGradientBrush))] 
class GradientConverter : IValueConverter 
{ 

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     var brush = new LinearGradientBrush(); 
     var color = (Color)value; 
     brush.StartPoint = new Point(0.5, 0); 
     brush.EndPoint = new Point(0.5, 1); 

     brush.GradientStops.Add(new GradientStop(Colors.White, 0)); 
     brush.GradientStops.Add(new GradientStop((Color)value, 1)); 

     return brush; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 
gibi bir şey here

Temelde bildirilmektedir

Ve XAML

<Border BorderThickness="1" BorderBrush="{TemplateBinding Background}" Background="{Binding Path=Background.Color, RelativeSource={RelativeSource TemplatedParent}, Converter={StaticResource gradConv}}"> 
+4

Bu cevap bana yararlı görünüyor. Bununla birlikte, temelde problemi kod arkasındaki çalışmayı yaparak altta yatan problemi tersine çevirir. Bu gibi senaryoları ele almak için ** XAML ** 'ı nasıl alacağımızı bilmek güzel olurdu. (Ayrıca, "olası açıklama ve geçici çözüm" bağlantınızın artık mevcut olmadığını da unutmayın. İlgili herhangi bir detayın, web üzerinde başka bir yerde bulunsa bile, SO cevabının kendi başına nasıl kopyalanabileceğine dair klasik örnek). –

İlgili konular