본문 바로가기

Programing (프로그래밍)/WPF & C# (C Sharp)

[자작] WPF & C# - 폴더트리를 StackPanel 로 구성 _ 슬라이드액션 첨가

728x90
반응형


 [자작] WPF & C# - 폴더트리를 StackPanel 로 구성 _ 슬라이드액션 첨가



StackPanelScrolling.zip




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 != nullbreak;   // 대상을 찾았을경우 스탑~!
        }
 
        // 해당 포인트로 이동
        MoveElement(stpOrigan, grdSelect);
    }
    catch { }
    finally
    {
        stackPanel = null;
        grdSelect = null;
    }
}
 
// 이동
void MoveElement(FrameworkElement stpOrigan, FrameworkElement grdSelect)
{
    // 해당 포인트로 이동
    Point ptStart = stpOrigan.TranslatePoint(new Point(00), canvas);   // 전체 StackPanel 담고 있는 객체
    Point ptTarget = grdSelect.TranslatePoint(new Point(00), 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(00), 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
반응형