Как передать путь в событие

372
06 февраля 2017, 14:39

Подскажите как передать в событие путь к другому EXE-шнику.

Имеется:

<StackPanel x:Name="stackPanel1" MouseLeftButtonDown="кнMouseLeftButtonDown">
    <Image x:Name="кн1" Height="64" Margin="0,10,55.8,10" VerticalAlignment="Top" RenderTransformOr Source="рисунки/111.png" HorizontalAlignment="Right" Width="64"/>
    <Image x:Name="кн2" Height="64" Margin="0,10,55.8,10" VerticalAlignment="Top" RenderTransformOrigin="0.5,0.5" Source="рисунки/111.png" HorizontalAlignment="Right" Width="64"/>
    <Image x:Name="кн3" Height="64" Margin="0,10,55.8,10" VerticalAlignment="Top" RenderTransformOrigin="0.5,0.5" Source="рисунки/111.png" HorizontalAlignment="Right" Width="64"/>
    <Image x:Name="кн4" Height="64" Margin="0,10,55.8,10" VerticalAlignment="Top" RenderTransformOrigin="0.5,0.5" Source="рисунки/111.png" HorizontalAlignment="Right" Width="64"/>
    <Image x:Name="кн5" Height="64" Margin="0,10,55.8,10" VerticalAlignment="Top" RenderTransformOrigin="0.5,0.5" Source="рисунки/111.png" HorizontalAlignment="Right" Width="64"/>
    <Image x:Name="кн6" Height="64" Margin="0,10,55.8,10" VerticalAlignment="Top" RenderTransformOrigin="0.5,0.5" Source="рисунки/111.png" HorizontalAlignment="Right" Width="64"/>
    <Image x:Name="кн7" Height="64" Margin="0,10,55.8,10" VerticalAlignment="Top" RenderTransformOrigin="0.5,0.5" Source="рисунки/111.png" HorizontalAlignment="Right" Width="64"/>
    <Image x:Name="кн8" Height="64" Margin="0,10,55.8,10" VerticalAlignment="Top" RenderTransformOrigin="0.5,0.5" Source="рисунки/111.png" HorizontalAlignment="Right" Width="64"/>
    <Image x:Name="кн9" Height="64" Margin="0,10,55.8,10" VerticalAlignment="Top" RenderTransformOrigin="0.5,0.5" Source="рисунки/111.png" HorizontalAlignment="Right" Width="64"/>
    <Image x:Name="кн10" Height="64" Margin="0,10,55.8,10" VerticalAlignment="Top" RenderTransformOr Source="рисунки/111.png" HorizontalAlignment="Right" Width="64"/>
</StackPanel>

Пути для каждой Image-кнопке хранятся в XML-ке Knopki.xml:

<?xml version="1.0" standalone="yes"?>
<DocumentElement>
  <Knopki>
    <nn>кн1</nn>
    <Название>xxx1</Название>
    <Видимость>true</Видимость>
    <Путь>C:\progi\xxx1.exe</Путь>
    <Иконка>xxx1.png</Иконка>
  </Knopki>
  <Knopki>
    <nn>кн2</nn>
    <Название>xxx2</Название>
    <Видимость>true</Видимость>
    <Путь>C:\progi\xxx2.exe</Путь>
    <Иконка>xxx2.png</Иконка>
  </Knopki>
  <Knopki>
    <nn>кн3</nn>
    <Название>xxx3</Название>
    <Видимость>true</Видимость>
    <Путь>C:\progi\xxx3.exe</Путь>
    <Иконка>xxx3.png</Иконка>
  </Knopki>
  <Knopki>
    <nn>кн4</nn>
    <Название>xxx4</Название>
    <Видимость>true</Видимость>
    <Путь>C:\progi\xxx4.exe</Путь>
    <Иконка>xxx4.png</Иконка>
  </Knopki>
  <Knopki>
    <nn>кн5</nn>
    <Название>xxx</Название>
    <Видимость>true</Видимость>
    <Путь>C:\progi\xxx5.exe</Путь>
    <Иконка>xxx5.png</Иконка>
  </Knopki>
</DocumentElement>

Как при клике по Image передать сюда путь к EXE-шнику?

private void MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    System.Diagnostics.Process.Start( ??? );
}

Надо чтобы при нажатии на Image запускать разные EXE-шники для каждого Image свой, указанные в XML-ке.

Изменил. Cделал так — поменял MouseButtonEventArgs на RoutedEventArgs:

private void  кнMouseLeftButtonDown(object sender, RoutedEventArgs e) 
{
    XDocument XMLdoc = XDocument.Load("Knopki.xml" );
     foreach (XElement kE in XMLdoc.Element("DocumentElement").Elements("Knopki"))
     {
         XElement nK = kE.Element("nn");
         XElement patch = kE.Element("Путь");
         if (nK.Value.ToString()  ==  ??????   ) {
             richTextBox1.AppendText("\n" + nK.Value.ToString() + "  " + patch.Value.ToString());
             System.Diagnostics.Process.Start( patch );
         }
     }
}
Answer 1

Ваша задача прекрасно ложится на MVVM.

Для начала, VM. Вам нужно создать класс, описывающий один объект. Как-нибудь так:

class Entry
{
    public string Title { get; }
    public bool IsVisible { get; }
    public string ExecutablePath { get; }
    public string IconPath { get; }
}

В вашей модели вы должны прочитать XML, превратить каждый из тегов Knopki в экземпляр Entry, и сложить все Entry в коллекцию (хотя бы в List<Entry>).

Теперь, View. С ним всё просто. Поскольку вы отображаете список, вам нужен ItemsControl. За отображение отдельного элемента отвечает, понятно, ItemTemplate.

<ItemsControl ItemsSource="{Binding EntryCollection}">
    <ItemsControl.ItemTemplate>
        <DataTemplate DataType="{x:Type vm:Entry}">
            <Button>
                <Image Height="64" Width="64" Source="{Binding IconPath}" />
            </Button>
       <DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

Чего у нас ещё нету, это реакции кнопок на нажатие. Для этого нужно подцепить к ним команду. Возьмите любую реализацию RelayCommand (например, отсюда), путь для запуска передавайте как параметр. Итого:

<ItemsControl Name="MainContainer" ItemsSource="{Binding EntryCollection}">

и

<Button Command="{Binding DataContext.InvokeExecute, ElementName=MainContainer}"
        CommandParameter="{Binding ExecutablePath}">

Ну и вам нужна сама команда в главной VM:

ICommand InvokeExecute = new RelayCommand<string>(path => Process.Start(path));
Answer 2

Отвечаю на свой вопрос, сделал вот так , работает

private void  кнMouseLeftButtonDown(object sender, RoutedEventArgs e) 
    {
        XDocument XMLdoc = XDocument.Load("Knopki.xml" );
        foreach (XElement kE in XMLdoc.Element("DocumentElement").Elements("Knopki"))
        {
            XElement nK = kE.Element("nn");
            XElement patch = kE.Element("Путь") ;
            if (nK.Value.ToString() == ((Image)e.OriginalSource).Name)
                System.Diagnostics.Process.Start(patch.Value.ToString());
        }
   }
READ ALSO
Свойство IsEnabled у Button

Свойство IsEnabled у Button

Свойство IsEnabled у Button я привязываю к свойству своего класса булевского типа IsCheckedНо я хочу, чтобы кнопка была доступна для нажатия, когда свойство...

433
Как создать картинку, если ее размер заранее неизвестен?

Как создать картинку, если ее размер заранее неизвестен?

Задача - штамповать разные изображения на полотноВот только размер полотна заранее неизвестен

375
Как встроить 7z.dll в exe?

Как встроить 7z.dll в exe?

argsName Почему-то содержит = "Project_file_backup

476