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
반응형
728x90
반응형

디스크의 남은 용량을 나타내는 프로그램 코드입니다.

 

MainWindow.xaml

 

<Window x:Class="WpfApp.MainWindow"

        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

        xmlns:local="clr-namespace:WpfApp"

        mc:Ignorable="d"

        Title="MainWindow" Height="450" Width="800">

    <StackPanel x:Name="stackPanel">

        <Label Content="전체 하드디스크 용량" HorizontalAlignment="Center" VerticalAlignment="Top"/>

        <Button x:Name="calButton" Content="계산하기" Width="200" Margin="0,0,0,20" Click="calButton_Click"/>

    </StackPanel>

</Window>

 

 

 

MainWindow.xaml.cs

 

using System;

using System.IO;

using System.Windows;

using System.Windows.Controls;

 

namespace WpfApp

{

    /// <summary>

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

    /// </summary>

    public partial class MainWindow : Window

    {

        public MainWindow()

        {

            InitializeComponent();

        }

 

        /// <summary>

        /// 계산하기 버튼 클릭 이벤트입니다.

        /// </summary>

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

        /// <param name="e"></param>

        private void calButton_Click(object sender, RoutedEventArgs e)

        {

            DriveInfo[] driveInfos = DriveInfo.GetDrives();

 

            foreach (DriveInfo driveInfo in driveInfos)

            {

                if (driveInfo.DriveType == DriveType.Fixed)

                {

                    ProgressBar progressBar = new ProgressBar() { HorizontalAlignment = HorizontalAlignment.Center };

 

                    // 전체 용량을 계산합니다.

                    progressBar.Maximum = Convert.ToInt32(driveInfo.TotalSize / 1024 / 1024);

 

                    // 남은 용량을 계산합니다. (MB)

                    progressBar.Value = Convert.ToInt32(driveInfo.TotalSize / 1024 / 1024) - Convert.ToInt32(driveInfo.AvailableFreeSpace / 1024 / 1024);

 

                    progressBar.Width = 200;

 

                    progressBar.Height = 20;

 

                    this.stackPanel.Children.Add(progressBar);

 

                    Label label = new Label() { HorizontalAlignment = HorizontalAlignment.Center };

 

                    label.Content = driveInfo.Name + " " + (driveInfo.TotalFreeSpace / 1024 / 1024) + "MB Free";

 

                    this.stackPanel.Children.Add(label);

                }

            }

        }

    }

}

 

 

계산하기 버튼을 클릭하면 디스크 남은 용량이 나열됩니다.

 

 

 

728x90
반응형

+ Recent posts