728x90
반응형

코드 비하인드에 정의한 static member 를 사용하는 방법입니다.

 

먼저 아래처럼 static member 를 선언합니다.

 

using System.Windows;

 

namespace WpfApp

{

    public partial class MainWindow : Window

    {

        public static double WidthCanvas = 5 * 96;

        public static double HeightCanvas = 7 * 96;

 

        public MainWindow()

        {

            InitializeComponent();

        }

    }

}

 

 

그리고 xaml 단에서 아래 굵게 표시된 부분처럼 사용하면 됩니다.

 

<Window x:Class="WpfApp.MainWindow"

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

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

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

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

        xmlns:src="clr-namespace:WpfApp"

        mc:Ignorable="d"

        Title="MainWindow" Height="400" Width="600">

    <DockPanel>

        <ScrollViewer VerticalScrollBarVisibility="Auto">

            <InkCanvas Name="inkcanv"

                    Width="{x:Static src:MainWindow.WidthCanvas}"

                    Height="{x:Static src:MainWindow.HeightCanvas}"

                    Background="LemonChiffon">

                <Line

                     Stroke="Red"

                     X1="0.875in"

                     Y1="0"

                     X2="0.875in"

                     Y2="{x:Static src:MainWindow.HeightCanvas}" />

                <Line

                     Stroke="Red"

                     X1="0.9375in"

                     Y1="0"

                     X2="0.9375in"

                     Y2="{x:Static src:MainWindow.HeightCanvas}" />

            </InkCanvas>

        </ScrollViewer>

    </DockPanel>

</Window>

 

 

 

* 아래처럼 작성후 밑줄이 그어지는 경우가 있는데

 

 

이때는 다시 빌드가 필요합니다.

 

* 혹 코드 상에 다른 에러가 있다면 빌드가 되지않아 밑줄그어진 상태가 유지되니 반드시

에러를 모두 확인 후 빌드 해야합니다.

 

728x90
반응형
728x90
반응형

특정 컨트롤에 ContextMenu 를 만드는 방법입니다.

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="400" Width="600">

    <TextBlock

 Name="txtblk"

 FontSize="24pt"

 HorizontalAlignment="Center"

 VerticalAlignment="Center"

 ToolTip="Right click to display context menu">

 TextBlock with Context Menu

        <TextBlock.ContextMenu>

            <ContextMenu MenuItem.Click="MenuItemOnClick">

                <MenuItem Header="Red" />

                <MenuItem Header="Orange" />

                <MenuItem Header="Yellow" />

                <MenuItem Header="Green" />

                <MenuItem Header="Blue" />

                <MenuItem Header="Indigo" />

                <MenuItem Header="Violet" />

            </ContextMenu>

        </TextBlock.ContextMenu>

    </TextBlock>

</Window>

 

 

MainWindow.xaml.cs

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();

        }

 

        void MenuItemOnClick(object sender, RoutedEventArgs args)

        {

            string str = (args.Source as MenuItem).Header as string;

            Color clr = (Color)ColorConverter.ConvertFromString(str);

            txtblk.Foreground = new SolidColorBrush(clr);

        }

    }

}

 

 

 

728x90
반응형
728x90
반응형

xml string 을 load 하여 화면에 보여주는 코드입니다.

(내용은 찰스패졸드 책 내용 인용)

 

using System.IO;

using System.Windows;

using System.Windows.Markup;

using System.Xml;

 

namespace WpfApp

{

    /// <summary>

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

    /// </summary>

    public partial class MainWindow : Window

    {

        public MainWindow()

        {

            InitializeComponent();

 

            string strXml = @"

<FlowDocument xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'

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

              TextAlignment='Left'>

    <Paragraph TextAlignment='Center' FontSize='32' FontStyle='Italic'

               LineHeight='24'>

        KJUN.KR

    </Paragraph>

    <Paragraph TextAlignment='Center'>

        &#x00A9; 2020 by kjun

    </Paragraph>

    <Paragraph FontSize='16pt' FontWeight='Bold' LineHeight='16'>

        Introduction

    </Paragraph>

    <Paragraph>

        KJUN.KR is a sample program from kjun

        <Italic>

            Applications = Code + Markup:

            A Guide to the Microsoft Windows Presentation Foundation

        </Italic>

        published by Microsoft Press in 2020.

        XAML Cruncher provides a convenient way to learn about and experiment

        with XAML, the Extensible Application Markup Language.

    </Paragraph>

    <Paragraph>

        XAML Cruncher consists of an Edit section (in which you enter and edit

        a XAML document) and a Display section that shows the object created

        from the XAML. If the XAML document has errors, the text is displayed

        in red and the status bar indicates the problem.

    </Paragraph>

    <Paragraph>

        Most of the interface and functionality of the edit section of

        XAML Cruncher is based on Windows Notepad.

        The

        <Bold>Xaml</Bold> menu provides additional features.

    </Paragraph>

    <Paragraph FontSize='16pt' FontWeight='Bold' LineHeight='16'>

        Xaml Menu

    </Paragraph>

    <Paragraph>

        The

        <Bold>Orientation</Bold> menu item lets you choose whether you

        want the Edit and Display sections of XAML Cruncher arranged

        horizontally or vertically.

    </Paragraph>

    <Paragraph>

        The

        <Bold>Tab Spaces</Bold> menu item displays a dialog box that lets

        you choose the number of spaces you want inserted when you press the

        Tab key. Changing this item does not change any indentation

        already in the current document.

    </Paragraph>

    <Paragraph>

        There are times when your XAML document will be so complex that it

        takes a little while to convert it into an object. You may want to

        <Bold>Suspend Parsing</Bold> by checking this item on the

        <Bold>Xaml</Bold> menu.

    </Paragraph>

    <Paragraph>

        If you've suspended parsing, or if you want to reparse the XAML file,

        select

        <Bold>Reparse</Bold> from the menu or press F6.

    </Paragraph>

    <Paragraph>

        If the root element of your XAML is

        <Italic>Window</Italic> ,

        XAML Cruncher will not be able to display the

        <Italic>Window</Italic>

        object in its own window.

        Select the

        <Bold>Show Window</Bold> menu item or press F7 to view

        the window.

    </Paragraph>

    <Paragraph>

        When you start up XAML Cruncher (and whenever you select

        <Bold>New</Bold> from the

        <Bold>File</Bold> menu), the Edit window

        displays a simple startup document.

        If you want to use the current document as the startup document,

        select the

        <Bold>Save as Startup Document</Bold> item.

    </Paragraph>

</FlowDocument>

";

 

            StringReader strreader = new StringReader(strXml);

            XmlTextReader xmlreader = new XmlTextReader(strreader);

            object obj = XamlReader.Load(xmlreader);

 

            Content = obj;

        }

 

    }

}

 

 

 

 

 

아래처럼 XML 에 frame 를 이용해 xml 파일을 지정할수도 있다.

 

<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="400" Width="600">

    <Frame Source="kjunkr.xaml" />

</Window>

 

 

 

728x90
반응형

'WPF' 카테고리의 다른 글

[WPF] static member 사용하기  (0) 2020.07.09
[WPF] ContextMenu  (0) 2020.07.08
[WPF] xml 로드하기  (0) 2020.07.08
[WPF] xml 16진수 값 0x0C은(는) 잘못된 문자입니다.  (0) 2020.07.08
[WPF] Hyperlink  (0) 2020.07.08
[WPF] Custom RoutedUICommand 만들기  (0) 2020.07.07
WPF
728x90
반응형

xml 로드시

"xml 16진수 값 0x0C은(는) 잘못된 문자입니다. "

이라는 에러가 발생했다.

원인은 원본데이터에 null byte가 있어서 XML문서가 깨지는거라고 한다.

아래처럼 xml string 을 아래 메서드를 통새 Replace 해주면 문제는 해결된다.

 

 

        public static string ReplaceHexadecimalSymbols(string txt)

        {

            string pattern = "[\x00-\x08\x0B\x0C\x0E-\x1F\x26]";

            return Regex.Replace(txt, pattern, "", RegexOptions.Compiled);

        }

 

 

728x90
반응형

'WPF' 카테고리의 다른 글

[WPF] ContextMenu  (0) 2020.07.08
[WPF] xml 로드하기  (0) 2020.07.08
[WPF] xml 16진수 값 0x0C은(는) 잘못된 문자입니다.  (0) 2020.07.08
[WPF] Hyperlink  (0) 2020.07.08
[WPF] Custom RoutedUICommand 만들기  (0) 2020.07.07
[WPF] TextBox 개행 가능하도록 하기  (0) 2020.07.07
728x90
반응형

HyperLink 를 삽입하는 코드입니다.

 

 

using System;

using System.Diagnostics;

using System.Windows;

using System.Windows.Documents;

using System.Windows.Navigation;

 

namespace WpfApp

{

    /// <summary>

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

    /// </summary>

    public partial class MainWindow : Window

    {

        public MainWindow()

        {

            InitializeComponent();

 

            Hyperlink hyperlink = new Hyperlink();

            hyperlink.Inlines.Add("kjun.kr");

            hyperlink.NavigateUri = new Uri("https://kjun.kr");

            hyperlink.RequestNavigate += Hyperlink_RequestNavigate;

            this.hyperLinkLabel.Content = hyperlink;

        }

 

        private void Hyperlink_RequestNavigate(object sender, RequestNavigateEventArgs e)

        {

            Process.Start(e.Uri.AbsoluteUri);

            e.Handled = true;

        }

    }

}

 

 

 

클릭하면 사이트로 이동합니다.

 

 

728x90
반응형
728x90
반응형

Custom RoutedUICommand 를 만드는 코드로

Ctrl+K 를 누른 경우 TextBox 에 'kjun.kr' 이 찍히도록 하는 예시코드입니다.

 

using System.Windows;

using System.Windows.Input;

 

namespace WpfApp

{

    /// <summary>

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

    /// </summary>

    public partial class MainWindow : Window

    {

        public MainWindow()

        {

            InitializeComponent();

 

            this.textBox.AcceptsReturn = true;

            this.textBox.AcceptsTab = true;

 

            InputGestureCollection inputGestureCollection = new InputGestureCollection();

            inputGestureCollection.Add(new KeyGesture(Key.K, ModifierKeys.Control));

 

            RoutedUICommand commandKjunkr = new RoutedUICommand("kjun.kr", "kjunkr", GetType(), inputGestureCollection);

            CommandBindings.Add(new CommandBinding(commandKjunkr, KjunkrOnExecute));

        }

 

        void KjunkrOnExecute(object sender, ExecutedRoutedEventArgs args)

        {

            this.textBox.SelectedText = "kjun.kr";

        }

    }

}

 

 

728x90
반응형
728x90
반응형

TextBox 에서 Enter 로 개행이 가능하도록 하게 하려면 아래 코드를 넣으면 됩니다.

 

 

this.textBox.AcceptsReturn = true;

 

 

또한 화면에 보이는 부분을 넘어간 경우 자동으로 개행이 되도록 하려면 아래 코드를 넣으면 됩니다.

 

 

this.textBox.TextWrapping = TextWrapping.Wrap;

 

 

 

728x90
반응형
728x90
반응형

ShowClassHierarchy.exe


ExploreDependencyProperties.exe




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

+ Recent posts