Привязка к ImageSource не отображается в ImageBrush - PullRequest
0 голосов
/ 09 мая 2019

Я генерирую растровые изображения в коде и хочу отобразить его в графическом интерфейсе. Но <ImageBrush> не показывает их как BitmapSource/ImageSource. Так же, как невидимое изображение в 3D-части. На <Image> (не на 3D-части) он отображается как хотел.

Я также попытался создать DiffuseMaterial и ImageBrush в коде и связать их непосредственно в <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 голосов
/ 09 мая 2019

Я не уверен, что это правильный ответ, но это решило мою проблему.Предоставление «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}}" />
...