#wpf #user-controls
#wpf #пользовательские элементы управления
Вопрос:
Я видел несколько сообщений, посвященных тому, как удалить пользовательский элемент управления, который был добавлен во время выполнения, но моя проблема немного другая. У меня есть пользовательский элемент управления, который состоит из изображения с маленькой кнопкой «x» в правом верхнем углу, которая используется для удаления самого себя (пользовательского элемента управления) из родительского холста. Также следует отметить, что пользовательский элемент управления добавляется во время выполнения, когда пользователь дважды нажимает на элемент ListBoxItem. У меня есть обработчик события Click для кнопки в правом верхнем углу, но этот код вообще не выполняется. Я знаю это, потому что у меня есть точка останова в этом коде, которая не достигается при нажатии кнопки.
Итак,
- Почему не обрабатывается событие нажатия кнопки удаления?
- Возможно, есть лучший способ реализовать это. Пожалуйста, сообщите.
Вот код, используемый для его добавления:
private void MyListBox_MouseDoubleClick(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
if (e.OriginalSource.ToString() == "System.Windows.Controls.Border" || e.OriginalSource.ToString() == "System.Windows.Controls.Image" || e.OriginalSource.ToString() == "System.Windows.Controls.TextBlock")
{
Expression.Blend.SampleData.MyCollection.Dataset lbi = ((sender as ListBox).SelectedItem as Expression.Blend.SampleData.MyCollection.Dataset);
var new_usercontrol = new MyUserControl();
new_usercontrol.MyImageSourceProperty = lbi.Image;
MyCanvas.Children.Add(new_usercontrol);
Canvas.SetLeft(new_usercontrol, 100);
Canvas.SetTop(new_usercontrol, 100);
Canvas.SetZIndex(new_usercontrol, 100);
}
}
Ниже приведен cs-код для пользовательского элемента управления:
public partial class ModuleElement : UserControl
{
public ImageSource MyProperty
{
get { return (ImageSource)this.image.Source; }
set { this.image.Source = value; }
}
public ModuleElement()
{
this.InitializeComponent();
}
private void RemoveButton_Click(object sender, RoutedEventArgs e)
{
((Canvas)this.Parent).Children.Remove(this);
}
}
XAML:
<Grid x:Name="LayoutRoot">
<Image x:Name="image" />
<Button x:Name="RemoveButton" Content="X" HorizontalAlignment="Right" Height="17.834" Margin="0" VerticalAlignment="Top" VerticalContentAlignment="Center" HorizontalContentAlignment="Center" Click="RemoveButton_Click">
</Button>
</Grid>
Заранее спасибо,
Брайан
Комментарии:
1. Боже мой, проверка типов путем сравнения строк, как будто одной проверки типов недостаточно! Пожалуйста, измените эти проверки на что-то вроде
e.OriginalSource.GetType() == typeof(Border)
, илиe.OriginalSource is Border
(что также должно разрешать подклассы)
Ответ №1:
Итак, я попробовал ваш код здесь точно, за исключением некоторых изменений имени, и не смог воспроизвести вашу проблему. По моему личному опыту, ваша проблема здесь должна заключаться в том, что по какой-то причине событие для щелчка не подписано должным образом. Для этого я бы зашел в designer для пользовательского элемента управления, удалил текущее событие для кнопки и дважды щелкнул в текстовом поле события designer, чтобы VS или Blend сгенерировали весь код, необходимый для правильной подписки.
Я создал образец, основанный на вашем коде здесь. Не стесняйтесь открыть его и посмотреть, сможете ли вы найти какие-либо несоответствия.
Что касается лучшего способа реализовать это, ознакомьтесь со старым добрым шаблоном MVVM и MVVM Light Toolkit. С помощью этого вы можете создать центральный класс ViewModel, который будет обрабатывать все ваши команды button и привязку без использования кода.