728x90
반응형

TreeView 이용하여 파일구조를 보는 프로그램 입니다.

 

DiskDirectory.cs

using System.Collections.Generic;

using System.IO;

 

namespace WpfApp

{

    public class DiskDirectory

    {

        /// <summary>

        /// 대렉토리 정보입니다.

        /// </summary>

        DirectoryInfo directoryInfo;

 

        /// <summary>

        /// 생성자입니다.

        /// </summary>

        /// <param name="directoryInfo"></param>

        public DiskDirectory(DirectoryInfo directoryInfo)

        {

            this.directoryInfo = directoryInfo;

        }

 

        /// <summary>

        /// 디렉토리 명입니다.

        /// </summary>

        public string Name

        {

            get { return directoryInfo.Name; }

        }

 

        /// <summary>

        /// 디렉토리의 자식 디렉토리입니다.

        /// </summary>

        public List<DiskDirectory> Subdirectories

        {

            get

            {

                List<DiskDirectory> diskDirectoryList = new List<DiskDirectory>();

                DirectoryInfo[] subDirectoryInfos;

 

                try

                {

                    subDirectoryInfos = directoryInfo.GetDirectories();

                }

                catch

                {

                    return diskDirectoryList;

                }

 

                foreach (DirectoryInfo subDirectoryInfo in subDirectoryInfos)

                {

                    diskDirectoryList.Add(new DiskDirectory(subDirectoryInfo));

                }

 

                return diskDirectoryList;

            }

        }

    }

}

 

 

 

MainWindow.xaml.cs

using System;

using System.IO;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Data;

 

namespace WpfApp

{

    /// <summary>

    /// MainWindow.xaml에 대한 상호 작용 논리

    /// </summary>

    public partial class MainWindow : Window

    {

        public MainWindow()

        {

            InitializeComponent();

 

            Title = "Template the Tree";

 

            // TreeView 를 정의합니다.

            TreeView treevue = new TreeView();

            Content = treevue;

 

            // DiskDirectory 를 기반으로 하는 HierarchicalDataTemplate 을 만듭니다.

            HierarchicalDataTemplate template = new HierarchicalDataTemplate(typeof(DiskDirectory));

 

            // template 의 ItemSource 에 바인딩될 항목을 정의합니다.("Subdirectories")

            template.ItemsSource = new Binding(nameof(DiskDirectory.Subdirectories));

 

            // 화면에 라벨로 표시될 TextBlock 을 위한 FrameworkElementFactory 를 정의합니다.

            FrameworkElementFactory factoryTextBlock = new FrameworkElementFactory(typeof(TextBlock));

 

            // TextBlock 에 바인딩될 항목을 정의합니다. ("Name")

            factoryTextBlock.SetBinding(TextBlock.TextProperty, new Binding(nameof(DiskDirectory.Name)));

 

            // template 의 VisualTree 에 Textblock 을 설정합니다.

            // 참고 : https://docs.microsoft.com/ko-kr/dotnet/framework/wpf/advanced/trees-in-wpf?redirectedfrom=MSDN

            template.VisualTree = factoryTextBlock;

 

            DiskDirectory dir = new DiskDirectory(new DirectoryInfo(Path.GetPathRoot(Environment.SystemDirectory)));

 

            // TreeViewItem 을 생성하여 루트요소를 바인딩하고 template 를 설정합니다.

            TreeViewItem item = new TreeViewItem();

            item.Header = dir.Name;

            item.ItemsSource = dir.Subdirectories;

            item.ItemTemplate = template;

 

            treevue.Items.Add(item);

 

            item.IsExpanded = true;

 

            // 모두 펼칩니다. (항목이 많은경우 시간 오래 걸림)

            //item.ExpandSubtree();

        }

    }

}

 

 

 

 

728x90
반응형
728x90
반응형

화면하단에 StatusBar 를 이용해 시계를 표시하는 코드입니다.

 

using System;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Controls.Primitives;

using System.Windows.Threading;

 

namespace WpfApp

{

    /// <summary>

    /// MainWindow.xaml에 대한 상호 작용 논리

    /// </summary>

    public partial class MainWindow : Window

    {

        /// <summary>

        /// 시간 상태바 아이템입니다.

        /// </summary>

        StatusBarItem timeStatusBarItem;

 

        public MainWindow()

        {

            InitializeComponent();

 

            DockPanel panel = new DockPanel();

            Content = panel;

 

            // 클라이언트 영역의 아래쪽에 도킹된 상태바를 만든다.

            StatusBar status = new StatusBar();

            panel.Children.Add(status);

            DockPanel.SetDock(status, Dock.Bottom);

 

            // StatusBarItem를 만든다.

            timeStatusBarItem = new StatusBarItem();

            timeStatusBarItem.HorizontalAlignment = HorizontalAlignment.Right;

            status.Items.Add(timeStatusBarItem);

 

            // StatusBarItem을 갱신하기 위한 타이머를 만든다.

            DispatcherTimer timer = new DispatcherTimer();

            timer.Interval = TimeSpan.FromSeconds(1);

            timer.Tick += TimerOnTick;

            timer.Start();

 

            // 화면 중앙에 RichTextBox 를 만든다.

            RichTextBox richTextBox = new RichTextBox();

            panel.Children.Add(richTextBox);

        }

 

        /// <summary>

        /// 타이머 동작 이베트입니다.

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="args"></param>

        void TimerOnTick(object sender, EventArgs args)

        {

            DateTime dt = DateTime.Now;

            this.timeStatusBarItem.Content = dt.ToLongDateString() + " " + dt.ToLongTimeString();

        }

    }

}

 

 

 

 

728x90
반응형
728x90
반응형

RichTextBox 내용 Clear 하는 코드입니다.

 

 

        RichTextBox richTextBox;        

 

        /// <summary>

        /// RichTextBox 내용을 모두 삭제합니다.

        /// </summary>

        void Clear()

        {

            // 1

            TextRange range = new TextRange(richTextBox.Document.ContentStart, richTextBox.Document.ContentEnd);

            range.Text = "";

 

            // 2

            richTextBox.Document.Blocks.Clear();

 

            // 3

            richTextBox.SelectAll();

            richTextBox.Selection.Text = "";

        }

 

728x90
반응형
728x90
반응형

이미지 주소를 BitmapImage 으로 변환하는 코드입니다.

 

using System;

using System.IO;

using System.Net;

using System.Windows.Media.Imaging;

 

namespace WpfApp

{

    public class Helper

    {

        /// <summary>

        /// 이미지 주소를 BitmapImage 으로 변환합니다.

        /// </summary>

        /// <param name="ImageUrl">이미지 주소입니다.</param>

        /// <returns></returns>

        public static BitmapImage LoadBitmapImage(string ImageUrl)

        {

            try

            {

                if (string.IsNullOrEmpty(ImageUrl)) return null;

 

                WebClient wc = new WebClient();

 

                Byte[] imshrBytes = wc.DownloadData(ImageUrl);

 

                wc.Dispose();

 

                BitmapImage bitmapImage = new BitmapImage();

 

                bitmapImage.BeginInit();

 

                bitmapImage.StreamSource = new MemoryStream(imshrBytes);

 

                bitmapImage.EndInit();

 

                return bitmapImage;

            }

            catch

            {

                return null;

            }

        }

    }

}

 

 

728x90
반응형
728x90
반응형

자식명으로 자식객체를 반환하는 코드입니다.

 

using System.Windows;

using System.Windows.Media;

 

namespace WpfApp

{

    public class Helper

    {

        /// <summary>

        /// 자식요소를 가져옵니다.

        /// </summary>

        /// <typeparam name="T">타입입니다.</typeparam>

        /// <param name="parentObject">부모객체입니다.</param>

        /// <param name="childName">자식요소명입니다.</param>

        /// <returns>자식 요소(객체)가 반환됩니다.</returns>

        public static T FindChild<T>(DependencyObject parentObject, string childName) where T : DependencyObject

        {

            if (parentObject == null) return null;

 

            T childT = null;

 

            // 부모가 가진 자식요소 수를 가져옵니다.

            int childrenCount = VisualTreeHelper.GetChildrenCount(parentObject);

 

            for (int i = 0; i < childrenCount; i++)

            {

                // 자식요소를 꺼냅니다.

                var child = VisualTreeHelper.GetChild(parentObject, i);

 

                // 꺼내고자하는 타입인지 확인합니다.

                T childType = child as T;

 

                if (childType == null)

                {

                    // 타입이 안맞는 경우 재귀하여 자식의 자식을 검사합니다.

                    childT = FindChild<T>(child, childName);

 

                    // 찾으면 멈춤

                    if (childT != null) break;

                }

                else if (!string.IsNullOrEmpty(childName))

                {

                    var frameworkElement = child as FrameworkElement;

 

                    // 자식요소의 이름이 같은지 확인합니다.

                    if (frameworkElement != null && frameworkElement.Name == childName)

                    {

                        childT = (T)child;

                        break;

                    }

                }

                else

                {

                    childT = (T)child;

                    break;

                }

            }

 

            return childT;

        }

    }

}

 

 

 

728x90
반응형
728x90
반응형

KeyGesture 를 이용해서 특정 키입력 시 이벤트 처리를 할수 있습니다.

아래는 Ctrl과 X를 동시에 눌렀을 경우 팝업을 띄우는 예제입니다.

 

using System.Windows;

using System.Windows.Input;

 

namespace WpfApp

{

    /// <summary>

    /// MainWindow.xaml에 대한 상호 작용 논리

    /// </summary>

    public partial class MainWindow : Window

    {

        KeyGesture gestCut = new KeyGesture(Key.X, ModifierKeys.Control);

 

        public MainWindow()

        {

            InitializeComponent();

 

            Title = "KeyGesture";

        }

 

        protected override void OnPreviewKeyDown(KeyEventArgs args)

        {

            if (gestCut.Matches(null, args))

            {

                CtrlXMethod();

                args.Handled = true;

            }

        }

 

 

        private void CtrlXMethod()

        {

            MessageBox.Show("Ctrl+X");

        }

    }

}

 

 

 

728x90
반응형
728x90
반응형

색상을 그리드 형태로 나열하여 선택 시 배경색이 바뀌는 코드입니다.

 

ColorGridBox.cs

using System.Collections.Generic;

using System.Reflection;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Controls.Primitives;

using System.Windows.Media;

using System.Windows.Shapes;

 

namespace WpfApp

{

    class ColorGridBox : ListBox

    {

        public ColorGridBox()

        {

            // ItemsPanel template 을 정의합니다.

            FrameworkElementFactory factoryUniformGrid = new FrameworkElementFactory(typeof(UniformGrid));

            // 10 개 컬럼을 갖도록 설정합니다.

            factoryUniformGrid.SetValue(UniformGrid.ColumnsProperty, 10);

            // template 을 ItemPanel 에 적용합니다.

            ItemsPanel = new ItemsPanelTemplate(factoryUniformGrid);

 

            // Color 이름을 가져옵니다.

            List<string> colorStringList = new List<string>();

            PropertyInfo[] propertyInfos = typeof(Colors).GetProperties();

            foreach (PropertyInfo propertyInfo in propertyInfos)

            {

                colorStringList.Add(propertyInfo.Name);

            }

 

            // Color 를 체웁니다.

            foreach (string colorString in colorStringList)

            {

                // 사작형으로 표시합니다.

                Rectangle rectangle = new Rectangle();

                rectangle.Width = 15;

                rectangle.Height = 15;

                rectangle.Margin = new Thickness(4);

                rectangle.Fill = (Brush)typeof(Brushes).GetProperty(colorString).GetValue(null, null);

 

                // ListBox 에 Add 합니다.

                Items.Add(rectangle);

 

                // 툴팁을 정의합니다.

                ToolTip toolTip = new ToolTip();

                toolTip.Content = colorString;

                rectangle.ToolTip = toolTip;

            }

 

            // Value 값을 사각형의 Fill 값으로 지정합니다.

            SelectedValuePath = "Fill";

        }

    }

}

 

 

 

 

MainWindow.xaml.cs

using System.Windows;

 

namespace WpfApp

{

    /// <summary>

    /// MainWindow.xaml에 대한 상호 작용 논리

    /// </summary>

    public partial class MainWindow : Window

    {

        public MainWindow()

        {

            InitializeComponent();

 

            Title = "Select Color Grid";

 

            ColorGridBox colorGridBox = new ColorGridBox() { Width = 350, VerticalAlignment = VerticalAlignment.Center };

            colorGridBox.SetBinding(ColorGridBox.SelectedValueProperty, "Background");

            colorGridBox.DataContext = this;

 

            Content = colorGridBox;

        }

    }

}

 

 

 

 

728x90
반응형
728x90
반응형

 

1.

 

using System.Reflection;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Media;

 

namespace WpfApp

{

    /// <summary>

    /// MainWindow.xaml에 대한 상호 작용 논리

    /// </summary>

    public partial class MainWindow : Window

    {

        public MainWindow()

        {

            InitializeComponent();

 

            Title = "List Color Names";

 

            // 윈도우의 목록처럼 ListBox를 생성

            ListBox listbox = new ListBox();

            listbox.Width = 150;

            listbox.Height = 150;

 

            Content = listbox;

            // 색상명으로 ListBox를 채움

            PropertyInfo[] props = typeof(Colors).GetProperties();

            foreach (PropertyInfo prop in props)

            {

                listbox.Items.Add(new { NAME = prop.Name, BRUSH = new SolidColorBrush((Color)prop.GetValue(null, null)) });

            }

 

            listbox.DisplayMemberPath = "NAME";

            listbox.SelectedValuePath = "BRUSH";

 

            // SelectedValue와 윈도우 배경색을 바인딩

            listbox.SetBinding(ListBox.SelectedValueProperty, nameof(List.Background));

            listbox.DataContext = this;

        }

    }

}

 

 

 

 

2.

 

using System.Reflection;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Documents;

using System.Windows.Media;

 

namespace WpfApp2

{

    /// <summary>

    /// MainWindow.xaml에 대한 상호 작용 논리

    /// </summary>

    public partial class MainWindow : Window

    {

        public MainWindow()

        {

            InitializeComponent();

 

            Title = "List Color";

 

            // 윈도우 Content를 위한 리스트 박스 생성

            ListBox listbox = new ListBox();

            listbox.Width = 150;

            listbox.Height = 150;

 

            Content = listbox;

 

            // label 컨트롤로 리스트 박스를 채움

            PropertyInfo[] props = typeof(Colors).GetProperties();

 

            foreach (PropertyInfo prop in props)

            {

                Color color = (Color)prop.GetValue(null, null);

 

                bool isBlack = .222 * color.R + .707 * color.G + .071 * color.B > 128;

 

                Label label = new Label();

                label.Content = prop.Name;

                label.Background = new SolidColorBrush(color);

                label.Foreground = isBlack ? Brushes.Black : Brushes.White;

                label.Width = 100;

                label.Margin = new Thickness(15, 0, 0, 0);

                label.Tag = new SolidColorBrush(color);

 

                listbox.Items.Add(label);

            }

 

            listbox.SelectedValuePath = nameof(Label.Tag);

            listbox.SetBinding(ListBox.SelectedValueProperty, nameof(List.Background));

            listbox.DataContext = this;

        }

    }

}

 

 

728x90
반응형
WPF
728x90
반응형

ListBox 에 Color 를 바인딩하고 Red 를 선택 및 스크롤하게 한다.

 

using System.Reflection;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Media;

 

namespace WpfApp

{

    /// <summary>

    /// MainWindow.xaml에 대한 상호 작용 논리

    /// </summary>

    public partial class MainWindow : Window

    {

        public MainWindow()

        {

            InitializeComponent();

 

            Title = "List Color Names";

            // 윈도우의 목록처럼 ListBox를 생성

            ListBox listbox = new ListBox();

            listbox.Width = 150;

            listbox.Height = 150;

            listbox.SelectionChanged += ListBoxOnSelectionChanged;

            Content = listbox;

            // 색상명으로 ListBox를 채움

            PropertyInfo[] props = typeof(Colors).GetProperties();

            foreach (PropertyInfo prop in props)

            {

                listbox.Items.Add(prop.Name);

            }

 

            listbox.SelectedItem = "Red";

            listbox.ScrollIntoView(listbox.SelectedItem);

            listbox.Focus();

        }

 

        void ListBoxOnSelectionChanged(object sender, SelectionChangedEventArgs args)

        {

            ListBox listbox = sender as ListBox;

            string str = listbox.SelectedItem as string;

            if (str != null)

            {

                Color clr = (Color)typeof(Colors).GetProperty(str).GetValue(null, null);

                Background = new SolidColorBrush(clr);

            }

        }

    }

}

 

 

 

 

728x90
반응형
728x90
반응형

WPF 응용프로그램을 실행하면 아래와 같이 상단에

검은색 메뉴 (런타임도구)가 나타나는데 이를 제거하고 싶을때 처리하는 방법입니다.

 

 

Visual Studio 의 도구 > 옵션 으로 들어가서

아래그림과 같이 왼쪽의 디버깅 > 일반 항목에서

우측의 XAML 용 UI 디버깅 도구 사용 > 애플리케이션에서 런타임 도구 표시 를 체크 해제하면 됩니다.

 

 

체크해제 한 후 실행하면 깨끗화게 없어진걸 확인할 수 있습니다.

 

 

 

728x90
반응형

+ Recent posts