Установить события для новых элементов интерфейса во время выполнения - PullRequest
0 голосов
/ 04 августа 2011

Я немного запутался с какой-то проблемой, я делаю проект, в котором пользователь должен иметь возможность создавать вопросы с помощью радиокнопок, поля со списком и т. Д. (Вроде как панель инструментов из VS10 для разработки вашего XAML).

Пока я могу перетащить UIElement, который я создал ранее, проблема возникает, когда пользователь создает новый элемент из моей панели инструментов, я не могу найти способ сделать этот новый UIElement, чтобы получить то же самое события из моего ранее созданного UIElement. Посмотрите на код

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
<Grid>
    <Canvas Height="190" HorizontalAlignment="Left" Margin="158,41,0,0" Name="canvas1" VerticalAlignment="Top" Width="322" AllowDrop="True">
        <Button Content="PROBANDO" Height="23" Name="button" Width="75" Canvas.Left="113" Canvas.Top="43" PreviewMouseDown="button_PreviewMouseDown" PreviewMouseMove="button_PreviewMouseMove" MouseUp="button_MouseUp" IsEnabled="True" />
        <TextBlock Canvas.Left="99" Canvas.Top="147" Height="23" Name="textBlock" Text="" Width="107" />
    </Canvas>
    <ListBox Height="190" Name="listBox" Width="126" Margin="12,41,365,80" >
        <ListBoxItem Content="Radio Button" Selected="radio_Selected" Name="radio" />
        <ListBoxItem Content="Text" Selected="text_Selected" Name="text" />
        <ListBoxItem Content="Combo Box" Name="combo" Selected="combo_Selected" />
    </ListBox>
</Grid>
</Window>


public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }
    Point p;


    private void button_MouseUp(object sender, MouseButtonEventArgs e)
    {
        button.ReleaseMouseCapture();
    }

    private void button_PreviewMouseDown(object sender, MouseButtonEventArgs e)
    {
        button.CaptureMouse();
        p = e.GetPosition(canvas1);
    }

    private void button_PreviewMouseMove(object sender, MouseEventArgs e)
    {
        Point x = e.GetPosition(canvas1);
        if (e.LeftButton == MouseButtonState.Pressed)
        {
            Canvas.SetLeft(button, Canvas.GetLeft(button) + (x.X - p.X));
            Canvas.SetTop(button, Canvas.GetTop(button) + (x.Y - p.Y));
        }
        p = x;
    }
    private void generic_PreviewMouseDown(UIElement sender, MouseEventArgs e)
    {
        Point x = e.GetPosition(canvas1);
        if (e.LeftButton == MouseButtonState.Pressed)
        {
            Canvas.SetLeft(sender, Canvas.GetLeft(sender) + (x.X - p.X));
            Canvas.SetTop(sender, Canvas.GetTop(sender) + (x.Y - p.Y));
        }
        p = x;
    }


    private void radio_Selected(object sender, RoutedEventArgs e)
    {
        RadioButton newRadio = new RadioButton();
        canvas1.Children.Add(newRadio);
        newRadio.PreviewMouseDown += generic_PreviewMouseDown(newRadio,?????);
        textBlock.Text = listBox.SelectedIndex.ToString();
    }



    private void text_Selected(object sender, RoutedEventArgs e)
    {
        TextBox newText = new TextBox();
        canvas1.Children.Add(newText);
        textBlock.Text = (String)listBox.SelectedIndex.ToString();
    }


    private void combo_Selected(object sender, RoutedEventArgs e)
    {
            Console.Write("Combo");

        textBlock.Text = (String)listBox.SelectedIndex.ToString();
    }

}

Спасибо!

1 Ответ

1 голос
/ 04 августа 2011

Если все, что вы хотите сделать, это нажать на новую кнопку RadioButton, измените эту строку:

newRadio.PreviewMouseDown += generic_PreviewMouseDown(newRadio,?????);

К этому:

newRadio.PreviewMouseDown += generic_PreviewMouseDown;

Редактировать

А затем вам нужно изменить generic_PreviewMouseDown на следующее:

private void generic_PreviewMouseDown(object sender, MouseEventArgs e)
{
    UIElement elem = sender as UIElement;

    Point x = e.GetPosition(canvas1);
    if (e.LeftButton == MouseButtonState.Pressed)
    {
        Canvas.SetLeft(elem, Canvas.GetLeft(elem) + (x.X - p.X));
        Canvas.SetTop(elem, Canvas.GetTop(elem) + (x.Y - p.Y));
    }
    p = x;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...