ImageBrush中未显示对ImageSource的绑定

时间:2019-05-09 14:49:55

标签: c# wpf helix-3d-toolkit

我正在代码中生成位图,并希望在GUI上显示它。但是<ImageBrush>并未将其显示为BitmapSource/ImageSource。就像3D部分中的不可见图像一样。 在<Image>(不是3D零件)上,它显示为所需。

我还尝试在后面的代码中创建DiffuseMaterialImageBrush并将它们直接绑定为<h:RectangleVisual3D>Material中。 并尝试在<VisualBrush>中使用<ImageBrush>而不是<Image>作为XAML的子级。

以下代码重现了我的情况:

MainWindow.xaml

<Window x:Class="WPF3DTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WPF3DTest"
        xmlns:h="http://helix-toolkit.org/wpf"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition />
        </Grid.RowDefinitions>
        <h:HelixViewport3D Grid.Row="0">
            <h:DefaultLights />
            <h:RectangleVisual3D Length="100" Width="100">
                <h:RectangleVisual3D.Material>
                    <DiffuseMaterial>
                        <DiffuseMaterial.Brush>
                            <ImageBrush Opacity="1" ImageSource="{Binding Image}" />
                        </DiffuseMaterial.Brush>
                    </DiffuseMaterial>
                </h:RectangleVisual3D.Material>
            </h:RectangleVisual3D>
        </h:HelixViewport3D>
        <Image Grid.Row="1" Source="{Binding Image}" />
    </Grid>
</Window>

MainWindow.xaml.cs

namespace WPF3DTest
{
    public partial class MainWindow : Window
    {
        public ImageSource Image { get; set; }

        public MainWindow()
        {
            InitializeComponent();

            DataContext = this;

            Image = new BitmapImage(new Uri("C:\\TypenschildDirectory\\Graphic\\laufrichtung2.png"));
            Image.Freeze();
        }
    }
}

new BitmapImage(new Uri(...))是我的测试。但是出于我的目的,它是通过使用Imaging.CreateBitmapSourceFromHBitmap(...)生成位图的。

1 个答案:

答案 0 :(得分:-2)

我不确定这是否是正确的答案,但是它解决了我的问题。 提供“ DataProxy” /“ BindingProxy”解决了<ImageBrush>的绑定。

据此链接https://thomaslevesque.com/2011/03/21/wpf-how-to-bind-to-data-when-the-datacontext-is-not-inherited/我了解到,<ImageBrush>没有继承DataContext。

<h:HelixViewport3D.Resources>
    <wpf:BindingProxy x:Key="ImageProxy" Data="{Binding Image}" />
</h:HelixViewport3D.Resources>
...
<ImageBrush Opacity="1" ImageSource="{Binding Data, Source={StaticResource ImageProxy}}" />