728x90
반응형
[자작] WPF & C# - 폴더트리를 StackPanel 로 구성 _ 슬라이드액션 첨가 |
MainWindow.xaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <Grid x:Name="gridOrigan"> <Canvas x:Name="canvas"> <StackPanel x:Name="stpOrigan"> <i:Interaction.Behaviors> <ei:FluidMoveBehavior Duration="0:0:0.5"> <ei:FluidMoveBehavior.EaseY> <QuinticEase EasingMode="EaseInOut"/> </ei:FluidMoveBehavior.EaseY> <ei:FluidMoveBehavior.EaseX> <CircleEase EasingMode="EaseOut"/> </ei:FluidMoveBehavior.EaseX> </ei:FluidMoveBehavior> </i:Interaction.Behaviors> </StackPanel> </Canvas> </Grid> | cs |
MainWindow.xaml.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 | public MainWindow() { InitializeComponent(); dirSearch(@".\폴더트리\"); } int imageCount = 0; // 이미지 총 개수 int stackCount = 0; // StackPanel 개수 private void dirSearch(string dir) { // 폴더에 따라 StackPanle 생성 StackPanel stp = new StackPanel(); stp.Orientation = Orientation.Horizontal; stackCount++; string[] Directories = Directory.GetDirectories(dir); // Defalut Folder // File string[] Files = Directory.GetFiles(dir); // File list Search foreach (string fileName in Files) // File check { // 이미지 생성 Image img = new Image(); img.Source = new BitmapImage(new Uri(Environment.CurrentDirectory + fileName, UriKind.RelativeOrAbsolute)); img.Stretch = Stretch.UniformToFill; img.Tag = imageCount; Slide2Move(img, stpOrigan); // 속성부여 // 라벨생성 (넘버링 체크) Label lbl = new Label(); lbl.Content = img.Tag.ToString(); lbl.Height = 10; // Grid 생성 Grid grid = new Grid(); grid.Width = grid.Height = 400; grid.Tag = imageCount; grid.Children.Add(img); grid.Children.Add(lbl); stp.Children.Add(grid); imageCount++; } stpOrigan.Children.Add(stp); // Folder foreach (string nodeDir in Directories) // Folder list Search { dirSearch(nodeDir); // reSearch } } // 이동 대상 찾기 StackPanel stackPanel = null; // 대상 포함여부 확인 int stackIndex = 0; Grid grdSelect = null; void Search(int index) { index = index % imageCount; // 끝까지 가면 다시 0부터 시작 try { // 해당 grid 찾기 for (int i = 0; i < stpOrigan.Children.Count; i++) // stackPanel 전체 찾기 { stackIndex = i; stackPanel = stpOrigan.Children.OfType<StackPanel>().ElementAt(i); grdSelect = stackPanel.Children.OfType<Grid>().FirstOrDefault(r => int.Parse(r.Tag.ToString()) == index); // 해당 stackPanel 에 대상포함여부 확인 if (grdSelect != null) break; // 대상을 찾았을경우 스탑~! } // 해당 포인트로 이동 MoveElement(stpOrigan, grdSelect); } catch { } finally { stackPanel = null; grdSelect = null; } } // 이동 void MoveElement(FrameworkElement stpOrigan, FrameworkElement grdSelect) { // 해당 포인트로 이동 Point ptStart = stpOrigan.TranslatePoint(new Point(0, 0), canvas); // 전체 StackPanel 담고 있는 객체 Point ptTarget = grdSelect.TranslatePoint(new Point(0, 0), canvas); // 해당 Grid 객체 Canvas.SetLeft(stpOrigan, ptStart.X - ptTarget.X); // 전체 이동 Canvas.SetTop(stpOrigan, ptStart.Y - ptTarget.Y); // 전체 이동 } // Action : 슬라이드 속성부여 void Slide2Move(object obj, object datumObj) { Image img = obj as Image; StackPanel stp = datumObj as StackPanel; bool dragMove = false; // 이동 가능여부 Point ptStart = new Point(); // 마우스 시작 위치 Point ptMove = new Point(); // 마우스 이동 위치 Point ptStartImg = new Point(); // 이미지 시작 위치 // Object 위치 입력 img.MouseLeftButtonDown += (s, a) => { // 해당 포인트로 이동 ptStartImg = img.TranslatePoint(new Point(0, 0), canvas); // img 시작 위치 ptStart = a.GetPosition(stp); // 마우스 시작 위치 dragMove = true; // 이동가능여부 }; // Object 원위치 this.MouseLeftButtonUp += (s, a) => { dragMove = false; }; // Object 마우스 드래그 무브 this.MouseMove += (s, a) => { if (dragMove) { Point pt = a.GetPosition(stp); ptMove.X = (pt.X - ptStart.X); ptMove.Y = (pt.Y - ptStart.Y); // 우측으로 액션 ( 이전페이지 ) if (ptMove.X > 30) { Search(int.Parse(img.Tag.ToString()) - 1); dragMove = false; } // 좌측으로 액션 ( 다음페이지 ) if (ptMove.X < -30) { Search(int.Parse(img.Tag.ToString()) + 1); dragMove = false; } // 올리는 액션 (아래줄로 이동) if (ptMove.Y < -30) { stackIndex = (stackIndex + 1 ) % stackCount; stackPanel = stpOrigan.Children.OfType<StackPanel>().ElementAt(stackIndex); MoveElement(stpOrigan, stackPanel); dragMove = false; } // 내리는 액션 ( 윗줄로 이동 ) if (ptMove.Y > 30) { if (stackIndex - 1 < 0) stackIndex = stackIndex + stackCount; stackIndex = (stackIndex - 1) % stackCount; stackPanel = stpOrigan.Children.OfType<StackPanel>().ElementAt(stackIndex); MoveElement(stpOrigan, stackPanel); dragMove = false; } } }; // Object 마우스 무브 해제 this.MouseLeave += (s, a) => { if (dragMove) { dragMove = false; } }; } | cs |
728x90
반응형