2013-04-09 55 views
0

我有一个图像与不透明蒙版,并希望增加可能性调整大小/重新定位不透明蒙版。 我是一个完整的WPF新手,所以可能是5月的思维是完全错误的,随时我:)扔任何想法绑定到元素位置不起作用?

所以我有这样的:

<Canvas Name="MainCanvas"> 
    <Rectangle Width="197.016" Height="120.896" Canvas.Left="76.119" Canvas.Top="73.134" Name="SelectionRectangle"></Rectangle> 
    <Image Source="Chrysanthemum.jpg" Width="{Binding ActualWidth, ElementName=MainCanvas, Mode=OneWay}" Height="{Binding ActualHeight, ElementName=MainCanvas, Mode=OneWay}"> 
     <Image.OpacityMask> 
      <RadialGradientBrush MappingMode="Absolute" 
           Center="{Binding ElementName=SelectionRectangle, Converter={StaticResource RectangleConverter}}" 
           GradientOrigin="{Binding ElementName=SelectionRectangle, Converter={StaticResource RectangleConverter}}" 
           RadiusY="{Binding ElementName=SelectionRectangle, Path=ActualHeight, Converter={StaticResource MathConverter}, [email protected]/2}" 
           RadiusX="{Binding ElementName=SelectionRectangle, Path=ActualWidth, Converter={StaticResource MathConverter}, [email protected]/2}"> 
       <GradientStop Color="#7C15161F" Offset="1" /> 
       <GradientStop Color="#FF40499E" Offset="0.999" /> 
       <GradientStop Color="#FF182395" Offset="0" /> 
      </RadialGradientBrush> 
     </Image.OpacityMask> 
    </Image> 
</Canvas> 

所以这是与放射渐变的掩模图像我试图用这个转换器放射渐变中心绑定到矩形中心:

public class RectangleConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     var rectangle = (Rectangle)value; 
     return new Point(Canvas.GetLeft(rectangle) + rectangle.ActualWidth/2f, Canvas.GetTop(rectangle) + rectangle.ActualHeight/2f); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return null; 
    } 
} 

一切编译和运行,但工程不正确,我猜是因为当矩形的位置变化,放射渐变中心绑定不知道关于这点(至少转换器中的断点不是通过改变矩形的位置来实现的)。 什么是最简单/推荐的方法来解决这个问题?

回答

0

我发现,Multibinding可以解决这个问题:

<Canvas Name="MainCanvas"> 
    <Rectangle Width="197.016" Height="120.896" Canvas.Left="76.119" Canvas.Top="73.134" Name="SelectionRectangle"></Rectangle> 
    <Image Source="Chrysanthemum.jpg" Width="{Binding ActualWidth, ElementName=MainCanvas, Mode=OneWay}" Height="{Binding ActualHeight, ElementName=MainCanvas, Mode=OneWay}"> 
     <Image.OpacityMask> 
      <RadialGradientBrush MappingMode="Absolute"                                               
           RadiusY="{Binding ElementName=SelectionRectangle, Path=ActualHeight, Converter={StaticResource MathConverter}, [email protected]/2}" 
           RadiusX="{Binding ElementName=SelectionRectangle, Path=ActualWidth, Converter={StaticResource MathConverter}, [email protected]/2}">      
       <RadialGradientBrush.Center> 
        <MultiBinding Converter="{StaticResource RectangleConverter}"> 
         <Binding ElementName="SelectionRectangle" Path="(Canvas.Left)"></Binding> 
         <Binding ElementName="SelectionRectangle" Path="ActualWidth"></Binding> 
         <Binding ElementName="SelectionRectangle" Path="(Canvas.Top)"></Binding> 
         <Binding ElementName="SelectionRectangle" Path="ActualHeight"></Binding> 
        </MultiBinding> 
       </RadialGradientBrush.Center> 
       <RadialGradientBrush.GradientOrigin> 
        <MultiBinding Converter="{StaticResource RectangleConverter}"> 
         <Binding ElementName="SelectionRectangle" Path="(Canvas.Left)"></Binding> 
         <Binding ElementName="SelectionRectangle" Path="ActualWidth"></Binding> 
         <Binding ElementName="SelectionRectangle" Path="(Canvas.Top)"></Binding> 
         <Binding ElementName="SelectionRectangle" Path="ActualHeight"></Binding> 
        </MultiBinding> 
       </RadialGradientBrush.GradientOrigin> 
       <GradientStop Color="#7C15161F" Offset="1" /> 
       <GradientStop Color="#FF40499E" Offset="0.999" /> 
       <GradientStop Color="#FF182395" Offset="0" /> 
      </RadialGradientBrush> 
     </Image.OpacityMask> 

    </Image> 
</Canvas> 

器和转换器:

public class RectangleConverter : IMultiValueConverter 
{ 
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return null; 
    } 

    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
    { 
     return new Point((double)values[0] + (double)values[1]/2d, (double)values[2] + (double)values[3]/2d);    
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) 
    { 
     return null; 
    } 
} 

不知道如果我是对的,但我的解释是 - 在我的问题绑定到整个对象,所以它不是一个依赖项属性,所以掩码没有通知有关更改。 现在多重绑定让我们来指定哪些属性是有趣的,并且当它们中的任何一个发生变化时,值转换器都会收到通知。