2010-10-07 11 views
6

Poniższy kod wiąże obiekt GradientStop z właściwością Background.Color z TemplatedParent. wszystko działa, ale otrzymuję błąd wiążącej w oknie wyjściowym:Oprawa GradientStop działa, ale raportowany jest błąd

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

Dlaczego nie połączyć samego tła z konkretnym kolorem gradientu? –

+0

Obiekt BorderBrush jest również powiązany z kolorem (bryłą), dlatego chcę ustawić kolor tylko raz, a gradient powinien mieć ten sam kolor dla gradientu. (I ja też chcę wiedzieć, dlaczego pojawia się błąd, kiedy to działa). – McCrille

Odpowiedz

1

miałem również ten sam błąd w danych wyjściowych programu Visual Studio konsoli.

Możliwym wyjaśnieniem i obejście tego jest zgłaszane here

Zasadniczo jeśli używasz konwertera zwracającą LinearGradientBrush wtedy nie pojawia się błąd

Kod jest coś takiego

[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(); 
    } 
} 

A w XAML

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

Ta odpowiedź wydaje mi się przydatna. Zasadniczo jednak rozwiązuje problem podstawowy, wykonując problematyczne zadania w kodzie źródłowym. Na pewno dobrze byłoby wiedzieć, jak uzyskać ** XAML **, aby z wdzięcznością obsługiwać takie scenariusze. (Zauważ również, że twój link do "możliwego wyjaśnienia i obejścia" już nie istnieje ... klasyczny przykład, dlaczego wszelkie istotne szczegóły powinny być zawsze kopiowane do samej odpowiedzi SO, nawet jeśli istnieją gdzie indziej w sieci). –