2009-07-10 12 views
15

Vektör grafiklerini, tercihen XAML olarak tanımlanan bir Görüntü denetiminin Kaynağı olarak kullanmak istiyorum, tıpkı PNG gibi raster bir görüntü kullanabiliyormuş gibi. Kolayca karıştırıp böyle, bitmap ve vektör görüntü arasında maç olabilir Bu şekilde:Vektör olarak bir XAML dosyası kullanma Resim Kaynağı

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

Module.xaml büyük olasılıkla kök elemanın yerine <UserControl> olarak <DrawingImage> olurdu.

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

bu mümkün mü: my ViewModel kendi takdirine bağlı bir tarama ya da vektör görüntüsünü birini seçin böylece

Aslında ne gerçekten gidiyorum, bu nedir? Belirli bir URI'dan Image.Source XAML sınıflarını yükleyebilir mi? Yoksa sadece bitmap kaynaklarını yükleyebilir mi?

+4

Merak etme ... WPF/Silverlight'ta bir XAML görüntüsünü kullanmak neden bu kadar zor ya da doğal olarak desteklenmiyor ... WPF/Silverlight'ın XAML'ye dayalı olduğunu düşünerek! – Jacques

cevap

1

1) DrawingImage.xaml dosyasını projeye ekleyin ve özelliklerini 'BuildAction = İçerik' ve 'Her Zaman Kopyala' olarak ayarlayın. Veya XAML'yi dinamik olarak dışarıdan yükleyebilirsiniz, çünkü açıklayacağım mantık da gevşek-xaml için çalışacaktır.

2) UIElement için XAML uri dönüştürmek için bir dönüştürücü yazın, sizin durumunuzda bu

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

FileStream'in derlenmiş bir kaynaktan (paket: // URI) yüklenebileceğini sanmıyorum, değil mi? –

+0

Yukarıda belirtilen yolu denedim ve iyi çalıştı. –

+0

Kaynakları burada işleyen bir dönüştürücü var: http://stackoverflow.com/a/21588195/418362 – Artfunkel

8

Sadece başvuruda bulunabilir aşağıdaki gibi XAML yaz) her zaman

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 DrawingImage

olacak Vektör grafikleri StaticResources olarak:

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

Görüntüleri bir ResourceDict içinde depolayın. DrawImage's olarak iyonik.

<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

Elbette. Veri bağlama senaryosunda bana yardımcı olmamakla birlikte (en azından doğrudan değil). –

1

yerleştir XAML kaynak türü 'Kaynak' ile (DrawingImage): Expression Blend bu şeyi oluşturmaya yardımcı olabilir. Daha sonra ayrı bir dosya değildir ve orijinal örneğinizde olduğu gibi bir URI ile doğrudan referans alınabilir - AMA URI önemsizdir. Microsoft'un "pack" URI sözdizimini anlamanız ve bunu kullanmanız gerekir.

+0

Belgelenmemiş, ancak "paket" URI dahili dosyaları, ilk UIE öğenizi oluşturduğunuza kadar _after_ belleğe yüklenmez. Bu nedenle, App.cs'de kullanmaya çalışın (MainWindow.xaml 'iniz yüklenmeden önce) oldukça sinir bozucu. Bunun yerine, MainWindow_Load işleyicinizde kullanın. –