Удаление UserControl, добавленного во время выполнения, с помощью кнопки в UserControl - PullRequest
3 голосов
/ 10 ноября 2011

Я видел несколько постов, посвященных тому, как удалить UserControl, который был добавлен во время выполнения, но моя проблема немного другая. У меня есть UserControl, который состоит из изображения с маленькой кнопкой «х» в правом верхнем углу, который используется для удаления себя (UserControl) из родительского холста. Также следует отметить, что UserControl добавляется во время выполнения, когда пользователь дважды щелкает элемент ListboxItem. У меня есть обработчик события Click для кнопки в верхнем правом углу, но этот код не работает вообще. Я знаю это, потому что у меня есть точка останова в этом коде, которая не достигается, когда я нажимаю кнопку.

Итак,

  1. Почему не обрабатывается событие click кнопки удаления?
  2. Может быть, есть лучший способ реализовать это. Пожалуйста, сообщите.

Вот код, используемый для его добавления:

    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 для UserControl:

    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>

Заранее спасибо,

Bryan

1 Ответ

0 голосов
/ 31 июля 2013

Итак, я попробовал ваш код здесь, за исключением некоторых изменений имени, и не смог воспроизвести вашу проблему. По моему личному опыту, ваша проблема здесь заключается в том, что по какой-то причине событие для клика не подписано должным образом. Для этого я хотел бы перейти в конструктор для пользовательского элемента управления, стереть текущее событие для кнопки и дважды щелкнуть в текстовом поле события дизайнера, чтобы VS или Blend генерировали весь код, необходимый для правильной подписки.

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

Что касается лучшего способа реализовать это, посмотрите старый добрый шаблон MVVM и MVVM Light Toolkit . Благодаря этому вы можете получить центральный класс ViewModel, который будет обрабатывать все ваши команды кнопок и привязку без кода позади.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...