【问题标题】:Binding GradientStop works but reports error绑定 GradientStop 有效但报告错误
【发布时间】:2010-10-07 14:37:21
【问题描述】:

以下代码将GradientStop 绑定到TemplatedParentBackground.Color 属性。一切正常,但我在输出窗口中遇到绑定错误:

System.Windows.Data 错误:2:找不到目标元素的管理 FrameworkElement 或 FrameworkContentElement。 BindingExpression:Path=Background.Color;数据项=空;目标元素是 'GradientStop' (HashCode=6944299);目标属性是“颜色”(输入“颜色”)

<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>

【问题讨论】:

  • 为什么不绑定背景本身,而不是渐变中的特定颜色?
  • BorderBrushs 也绑定到颜色(纯色),所以我只想设置一次颜色,并让渐变使用相同的颜色作为渐变停止。 (而且我也想知道为什么我在运行时会出错)

标签: wpf binding


【解决方案1】:

我在 Visual Studio 控制台输出中也遇到了同样的错误。

报告了一个可能的解释和解决方法here

基本上,如果您使用返回 LinearGradientBrush 的转换器,那么您不会收到错误

代码是这样的

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

在 XAML 中

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

【讨论】:

  • 这个答案对我来说似乎很有用。但是,它基本上通过在代码隐藏中进行有问题的工作来回避潜在问题。很高兴知道如何让 XAML 优雅地处理这样的场景。 (另请注意,您指向“可能的解释和解决方法”的链接不再存在......为什么任何相关细节应始终复制到 SO 答案本身的经典示例,即使它们存在于其他地方网络)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-18
  • 2014-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-15
  • 1970-01-01
相关资源
最近更新 更多