画布内的中心图像

Nic*_*ick 1 c# wpf

我有一个Image内部Canvas:

<Canvas>
    <Image HorizontalAlignment="Center" VerticalAlignment="Center" />
</Canvas>
Run Code Online (Sandbox Code Playgroud)

我希望在我的中心显示Image 始终(即使在可能的大小调整之后)Canvas,但是这样,图像在左上角绘制.我能怎么做?

dvv*_*vrd 8

如果你改变图像和画布的大小,那么这种方法最酷的东西就会起作用.转换器代码:

internal sealed class CenterConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        double canvasWidth = System.Convert.ToDouble(values[0]);
        double canvasHeight = System.Convert.ToDouble(values[1]);
        double controlWidth = System.Convert.ToDouble(values[2]);
        double controlHeight = System.Convert.ToDouble(values[3]);
        switch ((string)parameter)
        {
            case "top":
                return (canvasHeight - controlHeight) / 2;
            case "bottom":
                return (canvasHeight + controlHeight) / 2;
            case "left":
                return (canvasWidth - controlWidth) / 2;
            case "right":
                return (canvasWidth + controlWidth) / 2;
            default:
                return 0;
        }
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
Run Code Online (Sandbox Code Playgroud)

XAML,资源中的某个地方:

    <local:CenterConverter x:Key="CenterConverter" />
Run Code Online (Sandbox Code Playgroud)

XAML:

<Canvas x:Name="superCoolCanvas">
    <Image x:Name="superCoolImage" >
        <Canvas.Top>
            <MultiBinding Converter="{StaticResource CenterConverter}" ConverterParameter="top">
                <Binding ElementName="superCoolCanvas" Path="ActualWidth" />
                <Binding ElementName="superCoolCanvas" Path="ActualHeight" />
                <Binding ElementName="superCoolImage" Path="ActualWidth" />
                <Binding ElementName="superCoolImage" Path="ActualHeight" />
            </MultiBinding>
        </Canvas.Top>
        <Canvas.Left>
            <MultiBinding Converter="{StaticResource CenterConverter}" ConverterParameter="left">
                <Binding ElementName="superCoolCanvas" Path="ActualWidth" />
                <Binding ElementName="superCoolCanvas" Path="ActualHeight" />
                <Binding ElementName="superCoolImage" Path="ActualWidth" />
                <Binding ElementName="superCoolImage" Path="ActualHeight" />
            </MultiBinding>
        </Canvas.Left>
    </Image>
</Canvas>
Run Code Online (Sandbox Code Playgroud)