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