Подтвердить что ты не робот

Окно фона WPF ImageBrush не черепица

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

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

         

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

ТИА

4b9b3361

Ответ 1

Вам нужно установить свойство 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>

Примечание: два вторых сегмента атрибута 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
}

Ответ 2

Если вы хотите, чтобы все решение в С#

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;