0

不透明マスクのある画像があり、その不透明マスクのサイズを変更/再配置する可能性を追加したいと考えています。私は完全なWPF初心者なので、考えが完全に間違っているかもしれません。自由にアイデアを投げてください:)

だから私はこれを持っています:

<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}, ConverterParameter=@VALUE/2}" 
                                 RadiusX="{Binding ElementName=SelectionRectangle, Path=ActualWidth, Converter={StaticResource MathConverter}, ConverterParameter=@VALUE/2}">
                <GradientStop Color="#7C15161F" Offset="1" />
                <GradientStop Color="#FF40499E" Offset="0.999" />
                <GradientStop Color="#FF182395" Offset="0" />
            </RadialGradientBrush>
        </Image.OpacityMask>
    </Image>
</Canvas>

したがって、RadialGradientBrush マスクを含む画像があり、このコンバーターを使用して RadialGradientBrush の中心を四角形の中心にバインドしようとしています。

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

すべてがコンパイルおよび実行されますが、Rectangle の位置が変更されると、RadialGradientBrush Center バインディングがそれを認識しないため、正しく動作しないと思います (少なくとも、コンバーターのブレークポイントは、四角形の位置を変更してもヒットしません)。これを修正する最も簡単な/推奨される方法は何ですか?

4

1 に答える 1