22

PNG のようなラスター イメージを現在使用できるのと同じように、できれば XAML で定義されたベクター グラフィックスをイメージ コントロールのソースとして使用できるようにしたいと考えています。そうすれば、次のように、ビットマップ イメージとベクター イメージを簡単に組み合わせることができます。

<StackPanel>
    <Image Source="Images/Namespace.png"/>
    <Image Source="Images/Module.xaml"/>
</StackPanel>

<DrawingImage>Module.xaml は、 の代わりにルート要素として持つ可能性が最も高いでしょう<UserControl>

実際、私が本当に目指しているのはこれなので、ViewModel はその裁量でラスター イメージまたはベクター イメージを選択できます。

<Image Source="{Binding ImageUri}"/>

これは可能ですか?Image.Source は特定の URI から XAML クラスをロードできますか? それとも、ビットマップ リソースしかロードできませんか?

4

3 に答える 3

19

ベクター グラフィックスを StaticResources として参照するだけです。

<Image Source="{StaticResource MyImage}" />

イメージを ResourceDictionary に DrawImage として格納します。Expression Blend は、次のものを生成するのに役立ちます。

<ResourceDictionary
   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

   <DrawingImage x:Key="MyImage">
      <DrawingImage.Drawing>
         <DrawingGroup>
            <DrawingGroup.Children>
               <GeometryDrawing Brush="Black" Geometry="M 333.393,... 100.327 Z "/>
               <GeometryDrawing Brush="Black" Geometry="F1 M 202.309,... Z "/>
                      :
            </DrawingGroup.Children>
         </DrawingGroup>
     </DrawingImage.Drawing>
   </DrawingImage>

</ResourceDictionary>
于 2009-07-10T09:19:04.150 に答える
2

1) DrawingImage.xaml をプロジェクトに追加し、そのプロパティを 'BuildAction=Content' および 'Copy Always' に設定します。または、これから説明するロジックが Loose-xaml でも機能するため、外部から XAML を動的に読み込むことができます。

2)XAML uriをUIELementに変換するコンバーターを作成します。この場合、常にDrawingImageになります

public class FileToUIElementConverter :IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        FileStream fileStream = new FileStream((string)parameter, FileMode.Open); 
        return XamlReader.Load(fileStream) as DrawingImage;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

3) 以下のように XAML を記述します。

<Window.Resources>
    <local:FileToUIElementConverter x:Key="uriToUIElementConverter"/>
</Window.Resources>
<Grid>
    <Image Stretch="Fill" Source="{Binding Converter={StaticResource uriToUIElementConverter},ConverterParameter=ImageDrawing.xaml}"/>
</Grid>
于 2009-07-10T05:30:42.020 に答える
1

「リソース」タイプの XAML リソース (DrawingImage) を埋め込みます。それは別のファイルではなく、元の例のように URI を介して直接参照できますが、URI は自明ではありません。Microsoft の「pack」URI 構文を理解し、それを使用する必要があります。

于 2009-10-15T22:28:25.733 に答える