2009-07-10 11 views
15

XAMLで定義されているベクターグラフィックスをImageコントロールのソースとして使用できます。現在、PNGのようなラスターイメージを使用できるのと同じです。そうすれば、私は簡単にこのように、ビットマップとベクトル画像間のミックスと一致することができます:XAMLファイルをベクトルとして使用する画像ソース

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

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

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

はこれが可能である:私のViewModelはその裁量で、ラスターやベクトル画像のどちらかを選択することができるように

は実際に、私は本当にためつもりは、このですか? Image.Sourceは、指定されたURIからXAMLクラスをロードできますか?または、ビットマップリソースのみを読み込むことはできますか?

+4

私は不思議です...なぜWPF/SilverlightでXAMLイメージを使用するのは難しいか、またはネイティブにサポートされないのでしょうか... WPF/SilverlightはXAMLに基づいていると考えています! – Jacques

答えて

1

1)DrawingImage.xamlをプロジェクトに追加し、そのプロパティを 'BuildAction = Content'と 'Copy Always'に設定します。あるいは、私が説明しようとしているロジックがloose-xamlでも動作するので、外部からXAMLを動的にロードすることもできます。

2)、のUIElementにXAMLのURIを変換するコンバータを書くあなたのケースでは、常に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になります)あなたは、単純に参照することができ

<Window.Resources> 
    <local:FileToUIElementConverter x:Key="uriToUIElementConverter"/> 
</Window.Resources> 
<Grid> 
    <Image Stretch="Fill" Source="{Binding Converter={StaticResource uriToUIElementConverter},ConverterParameter=ImageDrawing.xaml}"/> 
</Grid> 
+0

FileStreamはコンパイルされたリソース(pack:// URI)から読み込むことはできないと思いますか? –

+0

私は上記の方法を試して、それはうまくいった。 –

+0

ここにリソースを処理するコンバータがあります:http://stackoverflow.com/a/21588195/418362 – Artfunkel

8

以下のようにXAMLを書きますあなたのベクトルグラフィックスをStaticResourcesとして:

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

イメージをResourceDict DrawImageとしてのionary。

<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> 
+0

もちろん。しかし、(少なくとも直接的ではないが)データバインディングのシナリオで私を助けない。 –

1

埋め込みXAMLリソースタイプ 'リソース' と(DrawingImage):Expression Blendが、あなたがこのようなものを生成することができます。それは別のファイルではなく、元の例のようにURIを介して直接参照することができますが、URIは自明ではありません。マイクロソフトの「パック」URI構文を理解し、それを使用する必要があります。

+0

これは文書化されていませんが、最初のUIElementをインスタンス化するまで、 "pack" URI内部構造はメモリにロードされません。ですから、MainWindow.xamlがロードされる前にApp.csでそれを使用しようとすると、かなりイライラします。代わりに、MainWindow_Loadハンドラで使用してください。 –

関連する問題