2011-08-04 4 views
2

제 문제는 사용자가 라디오 버튼, 콤보 상자 등을 만들 수 있도록 도구 상자를 만들려고한다는 것입니다. 그런 다음 만들어진 요소로 드래그 할 수 있습니다. 캔버스 안팎에 떨어 뜨려 라.드래그 앤 드롭을 처리하기 위해 새로운 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; 
    } 

    // Generic event to handle drag and drop on a new UIElement creadted by user 
    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; 
    } 

    // Creates a new radio button and assign the events to handle drag and drop 
    private void radio_Selected(object sender, RoutedEventArgs e) 
    { 
     RadioButton newRadio = new RadioButton(); 
     canvas1.Children.Add(newRadio); 
     newRadio.PreviewMouseDown += generic_PreviewMouseDown(newRadio, MouseEventArgs); 
     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(); 
    } 
} 

내 도구 상자는 목록 상자이므로 사용자가 항목을 선택하면 UI 요소가 만들어집니다.

도움을 주시면 감사하겠습니다. 사전에 감사하고 나의 영어에 대해 미안 해요!

답변

0

연결된 동작에 대한 작업과 비슷합니다. 요소를 드래그하는 것이 일반적인 예입니다. 여기에 하나가 있습니다 : drag behaviour 그리고 다른 것은 Drag & Drop With Attached Properties입니다.

코드를 정리해야합니다. 당신은 단지 부착을 수행하기위한 공통의 장소가 필요합니다 - 어쩌면 단지 방법이나 ElementFactory 클래스를 작성하십시오.

관련 문제