WPF отправляет значение в код от динамического изображения? - PullRequest
0 голосов
/ 02 июня 2018

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

Чтобы настроить изображения, которые у меня есть:

public class RBimageData
    {
        private string _Title;
        public string Title
        {
            get { return this._Title; }
            set { this._Title = value; }
        }

        private BitmapImage _ImageData;
        public BitmapImage ImageData
        {
            get { return this._ImageData; }
            set { this._ImageData = value; }
        }

        private String _ImageID;
        public String ImageID
        {
            get { return this._ImageID; }
            set { this._ImageID = value; }
        }
    }

    public MainWindow()
    {
        InitializeComponent();
        RBpartsList rbPartsList = mongoDB.GetRBparts("elements", 1, 7); // get parts from database

        List<RBpartsImages> rbImages = rbPartsList.RBparts;

        List<RBimageData> md = new List<RBimageData>();           
        foreach (RBpartsImages img in rbImages)
        {
            RBimageData m = new RBimageData
            {
                Title = img.ImageFilename,
                ImageID = "id_"+img.PartNum,
                ImageData = LoadImage(rbPartsList.FilePath,img.ImageFilename) }; // provides BitmapImage URI for image                
                md.Add(m);
        }

        RBbox.ItemsSource = md.ToArray();

} и изображения отображаются в XAML, я использовал элемент Tag для хранения ImageID:

   <ListView x:Name="RBbox" HorizontalAlignment="Stretch" VerticalAlignment="Bottom" Height="143" Margin="10,0,10,10" Background="#FFE6E2E2">
                    <ItemsControl.ItemsPanel>
                        <ItemsPanelTemplate>
                            <UniformGrid Columns="7" Rows="1" HorizontalAlignment="Stretch"/>
                        </ItemsPanelTemplate>
                    </ItemsControl.ItemsPanel>
                    <ListView.ItemTemplate>
                        <DataTemplate>
                            <StackPanel Orientation="Vertical" VerticalAlignment="Stretch" HorizontalAlignment="Stretch">

                                <Border BorderThickness="1" BorderBrush="#FF000000" VerticalAlignment="Top" HorizontalAlignment="Left" Width="100" Height="100" Background="#FFC1A0A0">

                                    <Button 
                                           MouseEnter="IdentifyPartImage_MouseEnter" 
                                           MouseLeave="IdentifyPartImage_MouseLeave" >
                                        <Image Source="{Binding ImageData}" 
                                               HorizontalAlignment="Stretch" VerticalAlignment="Top" 
                                               Stretch="UniformToFill" 
                                               Tag="{Binding ImageID}"/>
                                    </Button>
                                </Border>
                                <TextBlock Text="{Binding Title}" HorizontalAlignment="Center" VerticalAlignment="Top" Width="100" Height="14" FontSize="10" />

                            </StackPanel>
                        </DataTemplate>
                    </ListView.ItemTemplate>
                </ListView>

но в моем коде позади this.Tag всегда имеет значение null:

        private void IdentifyPartImage_MouseEnter(object sender, MouseEventArgs e)
    {
        // this fails - tag is null
        var imgId = this.Tag.ToString();              
        Debug.WriteLine("id: {0}, {1}", "imageID", imgId.ToString());
    }

Он не будет работать с x: Name = "{Binding ImageID}" .. Я не могу найти ничего, что позволитопределить, какое изображение было нажато, вы можете помочь?

Спасибо.

1 Ответ

0 голосов
/ 02 июня 2018

Когда вы ссылаетесь на this в своем коде, он указывает на объект Window.Вы ищете свойство Tag элемента управления Image.

Для этого я рекомендую определить события MouseEnter="IdentifyPartImage_MouseEnter" и MouseLeave="IdentifyPartImage_MouseLeave" для элемента управления Image, а затем параметр senderбудет таким Image объектом.

В вашем XAML:

<Button>
    <Image Source="{Binding ImageData}"
           HorizontalAlignment="Stretch"
           VerticalAlignment="Top"
           Stretch="UniformToFill"
           Tag="{Binding ImageID}"
           MouseEnter="IdentifyPartImage_MouseEnter"
           MouseLeave="IdentifyPartImage_MouseLeave"/>
 </Button>

И в вашем коде:

private void IdentifyPartImage_MouseEnter(object sender, MouseEventArgs e)
{
    var imgId = ((Image)sender).Tag.ToString();              
    Debug.WriteLine("id: {0}, {1}", "imageID", imgId);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...