Подскажите как передать в событие путь к другому 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 );
}
}
}
Ваша задача прекрасно ложится на 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));
Отвечаю на свой вопрос, сделал вот так , работает
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());
}
}
Сборка персонального компьютера от Artline: умный выбор для современных пользователей