如何在代码中创建平铺图像,这也是数据绑定的?

在代码隐藏中的当前,我动态地创建一个WPF图像控件,并将源代码绑定到自定义数据绑定。这最终将被添加到网格中以提供背景图像:

Image myImage = new Image();
myImage.Stretch = Stretch.UniformToFill;
myImage.SetBinding(Image.SourceProperty, myBinding);

问题是我想平铺这个图像,所以我唯一能找到的方法是创建一个ImageBrush并设置TileMode属性。但是没有“SetBinding”函数,那么我该如何实现我所需要的?

ImageBrush myBrush = new ImageBrush();
myBrush.TileMode = TileMode.Tile;
// Can't do this!
myBrush.SetBinding(ImageBrush.SourceImageProperty, myBinding);

有没有其他方法可以在代码隐藏中像这样平铺图像?

1
额外 编辑
意见: 1
你的意思是什么网格 - “网格布局”还是“数据网格”?
额外 作者 Dennis,
标准的网格布局。目前,我将Image控件放置在网格中,但我最好创建一个ImageBrush并将网格背景设置为此。
额外 作者 Ben McIntosh,

3 答案

你不需要改变任何东西,但使用BindingOperations:

BindingOperations.SetBinding(myBrush, ImageBrush.ImageSourceProperty, myBinding);

你需要定义视口并用刷子填充视口:

MyBrush.Viewport = new Rect(0, 0, 0.1, 0.1);
// Create a rectangle and paint it with the ImageBrush.
Rectangle rec = new Rectangle();
rec.Stroke = Brushes.LimeGreen;
rec.StrokeThickness = 1;
rec.Fill = MyBrush;
4
额外
谢谢,这最直接地回答我的问题。 BindingOperations.SetBinding()是这里的关键。我只是将我的Grid的背景设置为ImageBrush,而不是使用矩形。
额外 作者 Ben McIntosh,

我试过以下。在debugmode中,VisualBrush的属性设置正确。当然,图像显示为拉伸图像。不知道为什么。希望能帮助到你。

财产

        public TileMode Mode { get; set; }

绑定

        VisualBrush myBrush = new VisualBrush();

        Uri uri = new Uri("picture.png", UriKind.RelativeOrAbsolute);
        ImageSource src = new BitmapImage(uri);
        myBrush.Visual = new Image() { Source = src };

        this.Mode = TileMode.Tile;

        Binding bind = new Binding() { Source = Mode };
        BindingOperations.SetBinding(myBrush, VisualBrush.TileModeProperty, bind);

        this.Background = myBrush;
1
额外

我不喜欢背后的代码,所以我很难快速编写代码隐藏示例。
这里是标记示例:


    
        
        
    

    
        
        
    

    
        
    

您可以编写任何如下所示的绑定表达式来代替硬编码的图像( ImageSource =“Sample.jpg”): ImageSource =“{Binding MyBackgroundImageUri}”

0
额外