2010-11-04 11 views
16

Mam okno z obrazem tła. Obraz może się zmieniać w czasie wykonywania, co naprawdę nie powinno mieć znaczenia.Okno WPF Background ImageBrush nie sąsiadujące

Chcę, aby obraz był zamocowany w lewym górnym rogu (który jest), a nie skalowany (co jest również poprawne, ale potrzebuję obrazu do powtórzenia (kafelek), gdy okno jest większe niż obraz. robie ...

Czego mi brakuje?

TIA

Odpowiedz

39

Musisz ustawić właściwość TileMode jak również Viewport i ViewportUnits:

Na przykład

<Window.Background> 
    <ImageBrush ImageSource="myImage.png" 
     Viewport="0,0,300,300" 
     ViewportUnits="Absolute" 
     TileMode="Tile" 
     Stretch="None" 
     AlignmentX="Left" 
     AlignmentY="Top" /> 
</Window.Background> 

Uwaga: drugi 2 segmenty atrybutu Viewport wskazania żądanego rozmiaru każdego powtórzenia. Jeśli chcesz wyświetlić cały obraz, powinny to być szerokość i wysokość obrazu.

Przykâadowa: tiled magnifiers

Edycja w odpowiedzi na komentarze

Jeśli nie zna rozmiaru obrazu do określenia w nieruchomości Viewport, można użyć Binding ze związkiem IValueConverter obliczyć go z obrazu. Jestem przekonany, że musi istnieć lepszy sposób robienia tego, ale jeszcze nie znalazłem!

XAML:

<Window.Resources> 
    <local:Converter x:Key="Converter" /> 
</Window.Resources> 
<Window.Background> 

    <ImageBrush ImageSource="myImage.png" 
    ViewportUnits="Absolute" 
    TileMode="Tile" 
    Stretch="None" 
    AlignmentX="Left" 
    AlignmentY="Top" 
    Viewport="{Binding ImageSource, RelativeSource={RelativeSource Self}, Converter={StaticResource Converter}}"/> 
</Window.Background> 

konwerter Wartość:

public class Converter : IValueConverter 
{ 
    #region IValueConverter Members 

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     var source = (ImageSource)value; 
     return new Rect(0,0,source.Width, source.Height); 
    } 

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

    #endregion 
} 
+0

jestem - Ale to nie działa – Jeff

+0

@Jeff - Nie widziałem tego wcześniej, ale musisz ustawić Viewport i ViewportUnits - Zaktualizowałem odpowiedź, aby odzwierciedlić tę –

+0

(+1) Lepszą odpowiedź niż moje, wciąż używając ImageBrush. –

4

Jeśli chciałbyś całą rozwiązanie w C#

ImageBrush brush = new ImageBrush(); 
brush.ImageSource = new BitmapImage(new Uri(@"c:\your\image\source.gif")); 
brush.TileMode = TileMode.Tile; 
brush.ViewportUnits = BrushMappingMode.Absolute; 
brush.Viewport = new Rect(0, 0, brush.ImageSource.Width, brush.ImageSource.Height); 

MainWindow1.Background = brush; 
+0

Wiem, że to pytanie jest stare. Po prostu publikujesz możliwe rozwiązanie back-end. – Milne