在画布wpf之间动态切换

在画布wpf之间动态切换,wpf,canvas,Wpf,Canvas,我有多个不同类型的画布图像(图像源、几何体、路径),只希望根据字符串绑定显示1 最好的方法是什么 我希望它是可重用的,这样我就可以把这个代码放在一个用户控件中,然后在应用程序周围有很多这样的图像,我选择显示哪一个1 像这样: <CanvasImage Image="Pie"/> <CanvasImage Image="Dog"/> 在用户控件视图中声明它们并使用可见性绑定是否会在计算上过于昂贵 饼图画布示例: <canvas> <Data

我有多个不同类型的画布图像(图像源、几何体、路径),只希望根据字符串绑定显示1

最好的方法是什么

我希望它是可重用的,这样我就可以把这个代码放在一个用户控件中,然后在应用程序周围有很多这样的图像,我选择显示哪一个1

像这样:

<CanvasImage Image="Pie"/>
<CanvasImage Image="Dog"/>

在用户控件视图中声明它们并使用可见性绑定是否会在计算上过于昂贵

饼图画布示例:

<canvas>
    <Data ="m24,98,07">
</canvas>
<canvas>
    <image source="">
<canvas>

狗画布示例:

<canvas>
    <Data ="m24,98,07">
</canvas>
<canvas>
    <image source="">
<canvas>

此转换器根据接收到的值直接返回图像源

namespace TestTreeView.Views
{
    public class StringToImageConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            string file = "";

            string v = value as string;
            switch (v)
            {
                case "Pie":
                    file = @".\path\to\your\pie.jpg";
                    break;
                case "Dog":
                    file = @".\path\to\your\dog.jpg";
                    break;
                default:
                    return null;
            }

            return new BitmapImage(new Uri(file, UriKind.RelativeOrAbsolute));
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
}
XAML中的用法:

<Window xmlns:local="clr-namespace:YourNamespace.Views" ...>
    <Window.Resources>
        <local:StringToImageConverter x:Key="stringToImageConverter"/>
    </Window.Resources>

    <Grid>
        <Canvas>
            <Image Source="{Binding YourString, Converter={StaticResource stringToImageConverter}}"/>
        </Canvas>
    </Grid>
</Window>
<Window xmlns:local="clr-namespace:YourNamespace.Views" ...>
    <Window.Resources>
        <local:StringToVisibilityConverter x:Key="stringToVisibilityConverter"/>
    </Window.Resources>

    <Grid>
        <Canvas Visibility="{Binding YourString, Converter={StaticResource stringToVisibilityConverter}, ConverterParameter=Pie}"/>
        <Canvas Visibility="{Binding YourString, Converter={StaticResource stringToVisibilityConverter}, ConverterParameter=Dog}"/>
    </Grid>
</Window>
XAML中的用法:

<Window xmlns:local="clr-namespace:YourNamespace.Views" ...>
    <Window.Resources>
        <local:StringToImageConverter x:Key="stringToImageConverter"/>
    </Window.Resources>

    <Grid>
        <Canvas>
            <Image Source="{Binding YourString, Converter={StaticResource stringToImageConverter}}"/>
        </Canvas>
    </Grid>
</Window>
<Window xmlns:local="clr-namespace:YourNamespace.Views" ...>
    <Window.Resources>
        <local:StringToVisibilityConverter x:Key="stringToVisibilityConverter"/>
    </Window.Resources>

    <Grid>
        <Canvas Visibility="{Binding YourString, Converter={StaticResource stringToVisibilityConverter}, ConverterParameter=Pie}"/>
        <Canvas Visibility="{Binding YourString, Converter={StaticResource stringToVisibilityConverter}, ConverterParameter=Dog}"/>
    </Grid>
</Window>

此转换器根据接收到的值直接返回图像源

namespace TestTreeView.Views
{
    public class StringToImageConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            string file = "";

            string v = value as string;
            switch (v)
            {
                case "Pie":
                    file = @".\path\to\your\pie.jpg";
                    break;
                case "Dog":
                    file = @".\path\to\your\dog.jpg";
                    break;
                default:
                    return null;
            }

            return new BitmapImage(new Uri(file, UriKind.RelativeOrAbsolute));
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
}
XAML中的用法:

<Window xmlns:local="clr-namespace:YourNamespace.Views" ...>
    <Window.Resources>
        <local:StringToImageConverter x:Key="stringToImageConverter"/>
    </Window.Resources>

    <Grid>
        <Canvas>
            <Image Source="{Binding YourString, Converter={StaticResource stringToImageConverter}}"/>
        </Canvas>
    </Grid>
</Window>
<Window xmlns:local="clr-namespace:YourNamespace.Views" ...>
    <Window.Resources>
        <local:StringToVisibilityConverter x:Key="stringToVisibilityConverter"/>
    </Window.Resources>

    <Grid>
        <Canvas Visibility="{Binding YourString, Converter={StaticResource stringToVisibilityConverter}, ConverterParameter=Pie}"/>
        <Canvas Visibility="{Binding YourString, Converter={StaticResource stringToVisibilityConverter}, ConverterParameter=Dog}"/>
    </Grid>
</Window>
XAML中的用法:

<Window xmlns:local="clr-namespace:YourNamespace.Views" ...>
    <Window.Resources>
        <local:StringToImageConverter x:Key="stringToImageConverter"/>
    </Window.Resources>

    <Grid>
        <Canvas>
            <Image Source="{Binding YourString, Converter={StaticResource stringToImageConverter}}"/>
        </Canvas>
    </Grid>
</Window>
<Window xmlns:local="clr-namespace:YourNamespace.Views" ...>
    <Window.Resources>
        <local:StringToVisibilityConverter x:Key="stringToVisibilityConverter"/>
    </Window.Resources>

    <Grid>
        <Canvas Visibility="{Binding YourString, Converter={StaticResource stringToVisibilityConverter}, ConverterParameter=Pie}"/>
        <Canvas Visibility="{Binding YourString, Converter={StaticResource stringToVisibilityConverter}, ConverterParameter=Dog}"/>
    </Grid>
</Window>


请出示一些示例代码。这个问题我已经读了3遍了,仍然不知道你在问什么。它是关于可重用性的吗?演出如何绑定东西?基本上我现在有一个名为CanvasImage的用户控件。在里面,我有许多图像都在画布上。我绑定每个画布可见性,并将它们全部关闭,但我需要的1除外。然后我反复使用这个用户控件,每次只打开一个图像。几乎和字体的工作原理一样有更好的方法吗?这听起来像是,你要找的是
ResourceDictionary
。请出示一些示例代码。这个问题我已经读了3遍,仍然不知道你在问什么。它是关于可重用性的吗?演出如何绑定东西?基本上我现在有一个名为CanvasImage的用户控件。在里面,我有许多图像都在画布上。我绑定每个画布可见性,并将它们全部关闭,但我需要的1除外。然后我反复使用这个用户控件,每次只打开一个图像。几乎和字体的工作原理一样,有没有更好的方法来实现这一点?这听起来像是,您正在寻找的是
ResourceDictionary