Привязка к ImageSource не отображается в ImageBrush

Я создаю растровые изображения в коде и хочу отобразить их в графическом интерфейсе. Но <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(...).


person Bergi9    schedule 09.05.2019    source источник
comment
Image должен быть свойством зависимости, поэтому он будет уведомлять привязку в XAML при изменении своего значения, чтобы привязка знала, когда обновлять целевое свойство. Обратите внимание, что DataContext = this относительно безвреден для Window, как здесь, но плохая практика в UserControls, потому что он нарушит любые другие привязки. Так что лучше выработать привычку использовать вместо этого привязки RelativeSource.   -  person 15ee8f99-57ff-4f92-890c-b56153    schedule 09.05.2019
comment
В моем реальном приложении пример Image находится в ViewModel с NotifyPropertyChanged. Регистрируете свойство зависимости в ViewModel?   -  person Bergi9    schedule 09.05.2019
comment
К сожалению, я не могу помочь вам диагностировать проблемы в коде, который вы мне не показали. Удачи.   -  person 15ee8f99-57ff-4f92-890c-b56153    schedule 09.05.2019


Ответы (1)


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