Окно фона WPF ImageBrush не черепица - PullRequest
16 голосов
/ 04 ноября 2010

У меня есть окно с фоновым изображением. Изображение может измениться во время выполнения, что действительно не должно иметь значения для этого.

Я хочу, чтобы изображение было зафиксировано в верхнем левом углу (что оно есть), а не в масштабе (что также правильно. Но мне нужно, чтобы изображение повторялось (мозаика), когда окно стало больше, чем изображение. делает ...

Чего мне не хватает?

ТИА

Ответы [ 2 ]

40 голосов
/ 04 ноября 2010

Вам необходимо установить свойство TileMode, а также Viewport и ViewportUnits:

Например:

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

Примечание: вторые 2 сегмента атрибута Viewport указывают желаемый размер каждого повторения. Если вы хотите отобразить все изображение, это должны быть ширина и высота изображения.

Пример вывода: tiled magnifiers

Редактировать в ответ на комментарии

Если вы не знаете размер изображения, который нужно указать в свойстве Viewport, вы можете использовать Binding и IValueConverter для его вычисления по изображению. Я убежден, что должен быть лучший способ сделать это, но я еще не нашел его!

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>

Значение преобразователя:

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
}
5 голосов
/ 10 апреля 2014

Если вы хотите, чтобы все решение в 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...