728x90
반응형

1. WPF .NET 6 프로젝트 생성

2. Nuget 설치
Syncfusion.PdfViewer.WPF 
System.Drawing.Common

3. PdfViewer 를 이용한 pdf 파일 로드
MainWindow.xaml

<Window x:Class="PdfTest.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:syncfusion="clr-namespace:Syncfusion.Windows.PdfViewer;assembly=Syncfusion.PdfViewer.WPF"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800"
        WindowState="Maximized">
    <Grid>
        <syncfusion:PdfViewerControl x:Name="pdfViewer"></syncfusion:PdfViewerControl>
    </Grid>
</Window>

MainWindow.xaml.cs

PdfLoadedDocument pdfLoadedDocument = new PdfLoadedDocument(@"test.pdf");
pdfViewer.ItemSource = pdfLoadedDocument;

 

4. Text Insert (폰트 유의 - 한글지원 폰트)
5페이지의 해당 좌표위치에 '테스트 테스트' 문자열을 추가합니다.

PdfLoadedPage page = pdfLoadedDocument.Pages[5] as PdfLoadedPage;

var graphics = page.Graphics;

// 1. Text Insert
PdfFont font = new PdfCjkStandardFont(PdfCjkFontFamily.HanyangSystemsShinMyeongJoMedium, 13);
graphics.DrawString("테스트도 테스트시", font, PdfBrushes.Black, new PointF(170, 107));

5. Image Insert
5페이지의 해당 좌표위치에 'kei.jpg' 이미지를 추가합니다.

PdfLoadedPage page = pdfLoadedDocument.Pages[5] as PdfLoadedPage;

var graphics = page.Graphics;

// 2. Image Insert
PdfBitmap image = new PdfBitmap("kei.jpg");
graphics.DrawImage(image, 110, 190);

6. Table Insert
Sample Data

DataTable table = new DataTable();
table.Columns.Add("순위/구분");
table.Columns.Add("시간/수량(mm)");
table.Columns.Add("시간/일시");
table.Columns.Add("일/수량(mm)");
table.Columns.Add("일/일시");

table.Rows.Add(new string[] { "1", "95", "1998.08.12", "407", "1998.08.12" });
table.Rows.Add(new string[] { "2", "67", "2020.08.28", "202", "2003.07.09" });
table.Rows.Add(new string[] { "3", "66", "1997.08.03", "197", "2016.07.04" });


PdfLightTable 사용

PdfLightTable pdfLightTable = new PdfLightTable();
pdfLightTable.DataSource = table;
pdfLightTable.Draw(graphics, new PointF(100, 200));


PdfGrid 사용

PdfGrid pdfGrid = new PdfGrid();
pdfGrid.DataSource = table;

pdfGrid.Columns[0].Width = 80;
pdfGrid.Columns[1].Width = 100;
pdfGrid.Columns[2].Width = 80;
pdfGrid.Columns[3].Width = 100;
pdfGrid.Columns[4].Width = 80;

PdfStringFormat format = new PdfStringFormat();
format.Alignment = PdfTextAlignment.Center;
format.LineAlignment = PdfVerticalAlignment.Bottom;

pdfGrid.Columns[0].Format = format;
pdfGrid.Columns[1].Format = format;
pdfGrid.Columns[2].Format = format;
pdfGrid.Columns[3].Format = format;
pdfGrid.Columns[4].Format = format;

PdfGridRowStyle pdfGridRowStyle = new PdfGridRowStyle();
pdfGridRowStyle.Font = new PdfCjkStandardFont(PdfCjkFontFamily.HanyangSystemsShinMyeongJoMedium, 13);
pdfGrid.Rows[0].Style = pdfGridRowStyle;
pdfGrid.Rows[1].Style = pdfGridRowStyle;
pdfGrid.Rows[2].Style = pdfGridRowStyle;
pdfGrid.Headers[0].Style = pdfGridRowStyle;

pdfGrid.Draw(graphics, new PointF(80, 400));

반응형
728x90
반응형

사용하고자할 Font 파일을 다운로드한다.
프로젝트에 Fonts 폴더를 만들고 다운로드한 폰트파일을 넣는다.

폰트의 속성창에서 아래처럼 리소스(Resource)를 선택한다.


화면의 xaml 단에아래처럼 정의해서 쓰면 된다.
FontFamily="/Wpf.FontTest;component/Fonts/#Donoun"

<Window x:Class="Wpf.FontTest.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"
        FontFamily="/Wpf.FontTest;component/Fonts/#Donoun"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <StackPanel>
        <Label  Content="다람쥐 헌 쳇바퀴에 타고파. 폰트 적용 예제(Donoun - 전체적용)" FontSize="25" />
        <TextBlock Text="다람쥐 헌 쳇바퀴에 타고파. 폰트 적용 예제(Noto Sans)" FontSize="25" FontFamily="/Wpf.FontTest;component/Fonts/#Noto Sans CJK KR"/>
        <TextBox   Text="다람쥐 헌 쳇바퀴에 타고파. 폰트 적용 예제(고딕)" FontSize="25" FontFamily="고딕"/>
        <Label  Content="다람쥐 헌 쳇바퀴에 타고파. 폰트 적용 예제(Donoun - 전체적용)" FontSize="25" />
    </StackPanel>
</Window>

여기서 중요한건 폰트명에 #을 붙이고 폰트 파일명을 넣는게 아니라 폰트이름을 넣어야하는데
이는 글꼴을 클릭하면 아래와 같은 창에서 글꼴 이름 을 넣어줘야한다.

그런데 아래처럼 간혹 글꼴이름이 한글로 나올때가 있는데

이때는 아래 코드를 통해 영어 명칭을 알아내 영어 명칭으로 넣어주어야한다.

/// <summary>
/// 설치된 글꼴 명칭 확인
/// </summary>
private void FontList()
{
    List<string> fontList = new List<string>();
    foreach (FontFamily font in Fonts.SystemFontFamilies)
    {
        fontList.Add(string.Join(",", font.FamilyNames.Values));
        Debug.WriteLine(string.Join(",", font.FamilyNames.Values));
    }
}

소스
https://github.com/kei-soft/KJunBlog/tree/master/Wpf.FontTest

반응형
728x90
반응형

Nuget 에서 AvalonEdit 을 검색해서 설치

MainWindow.xaml

<Window x:Class="AvaloneditTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:avalonedit="http://icsharpcode.net/sharpdevelop/avalonedit"
        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"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="5*"/>
            <ColumnDefinition Width="5*"/>
        </Grid.ColumnDefinitions>
        <avalonedit:TextEditor SyntaxHighlighting="C#" x:Name="CodeEditor1" FontFamily="Consolas" FontSize="10pt" IsReadOnly="True" Grid.Column="0"/>
        <avalonedit:TextEditor SyntaxHighlighting="C#" x:Name="CodeEditor2" FontFamily="Consolas" FontSize="10pt" IsReadOnly="True" Grid.Column="1" />
    </Grid>
</Window>

MainWindow.xaml.cs

using ICSharpCode.AvalonEdit.Highlighting;

using System.Windows;

namespace AvaloneditTest
{
    /// <summary>
    /// MainWindow.xaml에 대한 상호 작용 논리
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            CodeEditor1.SyntaxHighlighting = HighlightingManager.Instance.GetDefinitionByExtension(".cs");
            CodeEditor1.Load(@"MainWindow.xaml.cs");

            CodeEditor2.SyntaxHighlighting = HighlightingManager.Instance.GetDefinitionByExtension(".xaml");
            CodeEditor2.Load(@"MainWindow.xaml");
        }
    }
}

결과

반응형
728x90
반응형
DXSplashScreen.Show(
    (o) =>
    new Window
    {
        Focusable = true,
        WindowStyle = System.Windows.WindowStyle.None,
        AllowsTransparency = false,
        ShowInTaskbar = false,
        ShowActivated = false,
        Topmost = false,
        Background = Brushes.Transparent,
        SizeToContent = System.Windows.SizeToContent.WidthAndHeight,
        ResizeMode = System.Windows.ResizeMode.NoResize
    },

    (o) =>
    new LoadingDialogControl(),
    new object[] { new SplashScreenOwner(Application.Current.MainWindow), WindowStartupLocation.CenterOwner },
    null);

DXSplashScreen.Show() 쓰게 되면 가장 상단에 떠서 MessageBox 로 띄운 메세지 들이 뒤에 가려서 안보이게 되는데 위처럼 사용하면 MessageBox 가 가려지지 않고 상단에 표시 된다.
LoadingDialogControl 은 화면에 표시될  UserControl 이다.

반응형
728x90
반응형

xaml

      <CheckBox
      Command="{Binding SelfTestCommand}"
      CommandParameter="{Binding RelativeSource={RelativeSource self}, Path=IsChecked}"/>

cs

        private DelegateCommand<bool?> selfTestCommand;

        /// <summary>
        /// SelfTest Command
        /// </summary>
        public ICommand SelfTestCommand
        {
            get
            {
                if (this.selfTestCommand== null)
                {
                    this.selfTestCommand= new DelegateCommand<bool?>((param) => OnSelfTestCommand(param));
                }

                return this.selfTestCommand;
            }
        }

        private void OnFalseCallCommand(bool? isChecked)
        {
        }

 

반응형
728x90
반응형

<TextBlock
    HorizontalAlignment="Left"
    FontSize="12"
    FontWeight="Normal"
    Text="{Binding DataFloat, StringFormat={}{0:N3}mm}" />

결과 (DataFloat = 1.5678 인 경우)

1.568mm

반응형
728x90
반응형

xaml 단에 아래 처럼 선언하고

xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"

<ComboBox ItemsSource="{Binding Datas}" SelectedItem="{Binding SelectedData}">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="SelectionChanged">
            <i:InvokeCommandAction Command="{Binding DataCommand}" />
        </i:EventTrigger>
    </i:Interaction.Triggers>
</ComboBox>

 

반응형
728x90
반응형
    public class BooleanToVisibilityConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (true.Equals(value))
            {
                return Visibility.Visible;
            }

            if ("Hidden".Equals((parameter ?? "").ToString()))
            {
                return Visibility.Hidden;
            }

            return Visibility.Collapsed;
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
반응형
728x90
반응형
        #region AsyncAction
        /// <summary>
        /// Action 수행 및 CompleteAction 을 통해 완료시 Action 도 수행가능
        /// </summary>
        /// <param name="action"></param>
        /// <param name="completeAction"></param>
        public static void AsyncAction(Action action, Action completeAction = null)
        {
            System.Threading.Tasks.Task task = System.Threading.Tasks.Task.Run(() =>
            {
                System.Windows.Threading.Dispatcher.CurrentDispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Background, (Action)(() =>
                {
                    action.Invoke();
                }));
            });

            task.GetAwaiter().OnCompleted(() =>
            {
                if (task.Exception != null)
                {
                    throw task.Exception;
                }
                else
                {
                    completeAction?.Invoke();
                }
            });
        }
        #endregion

EventAggerator 에서 Publish 하게 될때 UI 가 갱신되기전에 Publish 가 수행되지 않게 되는데 이때 위 방법을 사용하게되면 Publish 가 바로 전달되어 실행되게 된다.

반응형
728x90
반응형

우선 아래 처럼 DevExpress dll 을 프로젝트에 참조 추가한다.

DevExpress 컨트롤을 이용해서 Waiting/Progress Dialog 띄우기 위해 UserControl 로 나타낼 화면을 만든다.

WaitIndicatorPopup.xaml

<UserControl
    x:Class="DevWaitIndicatorTest.WaitIndicatorPopup"
    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:dx="http://schemas.devexpress.com/winfx/2008/xaml/core"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    d:DesignHeight="450"
    d:DesignWidth="400"
    mc:Ignorable="d">
    <Grid>
        <dx:WaitIndicator
            Panel.ZIndex="100"
            Content="{Binding State}"
            DeferedVisibility="true">
            <dx:WaitIndicator.ContentTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Vertical">
                        <TextBlock FontSize="20" Text="Please Wait" />
                        <TextBlock Text="{Binding}" />
                    </StackPanel>
                </DataTemplate>
            </dx:WaitIndicator.ContentTemplate>
        </dx:WaitIndicator>
    </Grid>
</UserControl>

이제 위 UserControl 를 이용해 Waiting Dialog 를 띄워보자

DXSplashScreen 을 이용해 띄우면 되는데 아래 처럼 사용한다.

DXSplashScreen.Show<WaitIndicatorPopup>();

for (int i = 1; i <= 5; i++)
{
    DXSplashScreen.SetState(i * 20 + "%");
    Thread.Sleep(500);
}

DXSplashScreen.Close();

결과

xaml 단에서 {Binding State} 항목은 코드단의 DXSplashScreen.SetState("10%"); 로 설정한 문자열이 바인딩된다.

Progress Dialog 는 UserControl 을 아래 처럼 정의한다.

<UserControl
    x:Class="DevWaitIndicatorTest.ProgressBarPopup"
    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"
    d:DesignHeight="450"
    d:DesignWidth="800"
    Background="SkyBlue"
    mc:Ignorable="d">
    <Grid
        x:Name="LayoutRoot"
        HorizontalAlignment="Center"
        VerticalAlignment="Center">
        <Grid
            x:Name="Splash"
            Width="300"
            Margin="0"
            HorizontalAlignment="Center"
            VerticalAlignment="Top">
            <Grid x:Name="Back">
                <Border
                    Background="Black"
                    CornerRadius="3"
                    Opacity="0.15" />
                <Border
                    Margin="1"
                    Background="LightBlue"
                    CornerRadius="2" />
            </Grid>
            <Grid x:Name="Content_Area" Margin="5">
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="*" />
                </Grid.RowDefinitions>
                <TextBlock
                    x:Name="Info"
                    Margin="5,5,5,0"
                    Foreground="#FF2D2D2D"
                    Text="{Binding State}"
                    TextWrapping="Wrap" />
                <ProgressBar
                    x:Name="progressBar"
                    Grid.Row="1"
                    Height="12"
                    Margin="5"
                    IsIndeterminate="{Binding IsIndeterminate}"
                    Maximum="{Binding MaxProgress}"
                    Value="{Binding Progress}" />
            </Grid>
        </Grid>
    </Grid>
</UserControl>

이제 위 UserControl 를 이용해 Progress Dialog 를 띄워보자

DXSplashScreen.Show<ProgressBarPopup>();

for (int i = 1; i <= 5; i++)
{
    DXSplashScreen.Progress(i * 20, 100);
    DXSplashScreen.SetState(i * 20 + "%");
    Thread.Sleep(500);
}

DXSplashScreen.Close();

 

결과

소스

DevWaitIndicatorTest.zip
11.78MB

반응형

+ Recent posts