SettingUI : https://ghost1372.github.io/settingsui/

2022년 7월 25일 기준 SettingsUI의 Nuget 버전은 2.1.6이다. 이걸 이용해서 .Net6 용 WPF를 프로젝트를 만들고 nuget을 추가 후 바로 빌드하면 빌드 안될수 있다. 내가 발생한 부분에 대한 내용 및 해결방법을 정리한다.

1. nuget 자체가 설치 안될수 있다

이건 다른사람은 가능할 수 있다. 현재 작업환경이 윈도11(개발자 프리뷰)인데 그러다 보니 버전이 안맞아 생기는 문제로, 이는 프로젝트의 최소 OS 지원버전을 경고창에 나오는대로 맞춰주면 넘어간다.

대충 10.0.19041로 해주면 된다

2.  SettingUI의 icon을 찾을수가 없다?

nuget이 다운로드된 경로 이하에 icon이 없어서 실행이 안된다는 경고가 뜰수 있는데, 해당경로는 아래와 같다. (위에서 10.0.19041 버전을 설정했을 경우)

C:\Users\Admin\.nuget\packages\settingsui\2.1.6\lib\net6.0-windows10.0.19041

그럼 그 이하에 원하는 경로에 맞게 

SettingsUI\Assets\icon.png 파일을 넣어주면 된다. 폴더와 파일이 아예 없어서 발생하는 문제이니 일단 아무 128짜리 그림파일 하나 놔두면 된다.

일단 여기까지...

현재 윈도11을 사용중인데 맥의 매직키보드를 구입해서 사용중이기도 하다

이럴때 윈도우키, Ctrl, Alt, 한/영 키가 바뀌어 있어서 조금 번거로울때가 많은데 이럴때는 powertoy의 KeyboardManager를 이용하여 키 매핑을 하면 굉장히 쉽다.

심지어 한글이라 큰 어려움도 없을것이며, '키 다시 매핑'을 눌렀을때 설정하는 화면도 굉장히 간단하다.

 

하지만 키를 굉장히 빨리 눌렀을때 해당 키를 매핑된 키가 아닌 본래키로 인식하는 문제가 생길 수 있는데, 

레지스트리를 변경하는게 아닌건지 조금 의심스럽긴 하다.

어쨋든 강추

'잡 생각들' 카테고리의 다른 글

한국에서의 C#의 위상  (0) 2021.02.07
스타 개발자란.....?  (0) 2021.02.02

시계열로 설정 후 데이터는 Bson 계열로 넣게 되는데, 이때 c#에서는(이미 collection까지 연결확인 됐다고 치고)

json형식인
{
key1 : value1,
key2 : value2
}

의 형태로 bson을 구성하면 된다.

일단 시계열일때 time의 값을 'time'으로 설정하고 C#의 DateTime 형식을 그대로 사용할수 있는데 아래의 코드처럼

이후 collection.InsertOne(doc); 호출

하면 데이터가 완성된다.

그리고 key1, key2로 표현되는 데이터 쪽은 리스트나 배열일 경우 BsonArray 등으로 json의 형태처럼 그대로 구성하면 된다. 

 Compass에서 Add Data를 하면 나오는 창에서 기본적으로 objectID만 설정된 상태일텐데 여기서,

가장 기본적인 대화창

Collection의 TimeField를 "ts"로 정했다면 아래와 같이 ts 값을 넣어주면 된다.

그렇게 데이터가 입력되면 아래와 같이 기록이 된다

documents의 화면

이렇게 데이터를 넣으면 된다

VS2019에서 .NET5 프로젝트들을 생성하면 빌드시
Bin\Debug\net5.0 이나 net5.0-windows 같은 폴더 이하에 빌드파일들이 생성되는것을 확인할 수 있는데,

이렇게 되면 여러 프로젝트들을 묶은 솔루션 같은 경우 전체 프로젝트들을 빌드시 빌드파일들의 경로가 중구난방이 된다.

기존의 4.8이하의 버전에서는 프로젝트 속성에서 설정한 출력경로 거기에 바로 파일들이 떨어졌었는데 이번에는 .Net5의 특성으로 인해 각종 설정이 붙다보니 뒤에 계속 접미사가 붙는것 같다.

 

솔루션의 해당 프로젝트마다 프로젝트 편집기를 통해 xml파일을 편집하는 화면으로 넘어가서 

맨 아래쪽 네 라인을 추가하면 된다

<PropertyGroup>
   <AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
   <AppendRuntimeIdentifierToOutputPath>false</AppendRuntimeIdentifierToOutputPath>
</PropertyGroup>

위 코드를 추가하면 프로젝트 속성에서 설정한 출력경로로 바로 어셈블리들이 떨어지게 된다.

각 프로젝트마다 설정해 줘야 한다.

 

Custom Region Adapter : Create a Custom Region adapter for the StackPanel

여기서는 바로 이전 챕터에서 확인했었던 Region이라는 개념에 대한 확장판이다. 단순히 특정 View에 RegionName을 설정할 수 있다 라는 개념을 이전 챕터에서 확인했다면, 여기서는 Region이라는 개념을 이용하여 View를 초기화 하고 Region설정을 하는 등의 동작을 구분하여 구현할 수 있는 Adapter라는 개념을 통해 View Control를 할 수 있게 도와주는 동작이 가능하게 되어 있다. 당연히 이런 부분은 Prism에서 주요 설계패턴으로 가지고 가는 MVVM 패턴에서 따로 디자인되어 구현되어 갈 수 있는 부분이기도 하다.

이 부분 부터는 코드를 확인하면서 가야하는 부분이기도 하다.

Application 초기화 부분인 App.cs에서 이번에도 PrismApplication을 상속하여 실행하고 있고, 동일하게
CreateShell(), RegisterTypes(..), 추가로 ConfigureRegionAdapterMappings(...)를 오버라이딩하여 구현해놓았다.

CreateShell(), RegisterTypes(..)는 이전과 동일하고 큰 내용은 없으나 이번에 주요하게 봐야하는 부분은 ConfigureRegionAdapterMappings(...) 이 함수인데, CreateShell()이전에 호출되어 View단이 초기화 되어 실행하기 전에 호출된다. 그리고 이 챕터의 메인이 되는 Region들의 Adapter들을 Mapping한 객체들을 등록하는곳이다.

base함수를 호출 후(내부 초기화 인듯) RegisterMapping함수를 통해 한 객체를 등록하는데,

App.cs

바로 StackPanelRegionAdapter라는 RegionAdpaterBase<T>를 동록한다. T는 UI Element. 여기서는 StackPanel.
여기서는 RegionAdapterBase<T>라는 클래스가 중점인데, 해당 클래스는 IRegionAdapter<T>이며 이는 Prism Lib이다. 

여기서 추측해보자면 IRegionAdpater<T> -> RegionAdapterBase<T>는 Region의 Adapter역할을 하는 클래스라는것을 이름을 통해 확인할 수 있으며 다음의 코드를 통해 더욱더 자세한 역할을 볼수 있다.

StackPanelRegionAdapter : RegionAdaterBase<StackPanel>

해당 Adapter는 Shell이 만들어 지고 UI가 출력될때 동작한다. (당연히 동적으로 생성되는건 위 코드에서 등록되는 타임)

여기서는 Adapter에서 IRegion -> Region -> AllActiveRegion 객체를 리턴하며 위 Adapt(...) 에서 View들을 Control 하기 위한 구현부들이 존재한다.

여기서 디버깅타임을 통해 확인할 수 있는것은, Adapt의 파라미터중 IRegion으로 넘어오는 객체가 아래에서 생성했던 AllActiveRegion 객체이며 이 객체의 Name이 MainWindow의 ContentControl의 RegionName으로 설정한 ContentRegion이다. 

MainWindow에서 RegionManager로 설정한 UI Element의 RegionName이 ContentRegion이며 이 UI Element는 StackPanel 이었다. StackPanelRegionAdapter는 T로 Stack을 설정했었고 자동적으로 Prism Lib에서 MainWindow에 설정된 StackPanel을 Adapt할 수 있는 객체로 StackPanelRegionAdapter를 Prism Container에서 자동적으로 설정할 수 있게 도와주는 것이다. 

예로, MainWindow에 Grid를 따로 선언한 부분이 있다면,

MainWindow.xaml

저 GridRegion이라는 부분도 따로 GridRegionAdapter<Grid> Class 를 구현하여 App.cs에서 RegisterMapping에 등록한 후 추후 호출되는 GridRegionAdapter의 Adapt(...)에서 저 'GridRegion'과 Grid 객체가 같이 파라미터로 넘어오는것을 확인 할 수도 있다.

위 Adapt(...) 함수에서는 파라미터로 넘어오는 객체에 Region설정을 할 수도, T로 설정된 StackPanel의 객체에 직접 UI 컨트롤을 할 수도 있게 되었다. 너무 직접적인 UI Control은 Adapter라는 개념에 맞지는 않지만 직접 컨트롤 할 수도 있으므로 어떻게든 View단을 활용하면 될것이다.


이번 챕터의 의미는

  • 이전 챕터에서 배운 Region이라는 개념.
  • RegionName이 설정된 View는 RegionAdapterBase<T>로 Adapter화 하여 사용할 수 있게 도와준다.
  • RegionAdapterBase<T>은 Region을 적극적으로 활용할 수 있게 해주는 Adapter로서
    Region Control 설정과 UI Element를 직접 컨트롤 할 수 있게 해준다.

끝.

'개발 > Prism' 카테고리의 다른 글

[Prism][WPFSample] Regions  (0) 2021.07.19
[Prism][WPFSample] BootstrapperShell  (0) 2021.07.19
[Prism] WPF Sample  (0) 2021.07.19

Regions : Create a region

이번 샘플은 Prism에서 UI Control을 위한 라이브러리를 지원한다는것을 보여주기 위함인데 sample이 너무 simple하다. 하다못해, 버튼하나 누르면 구현부로 인해 UI가 변경되는것을 보여주는 형식이라도 되야하는데, 그냥 초기에 설정하고 바뀌는것은 하나도 없다. 이로 인해 여기서 Regions라는 기능을 확실하게 확인하기는 어렵지만 설정하는 부분에 대한 개념은 이해할 수 있으므로 코드를 보도록 하자.

우선, Regions 라는 기능을 이해하기 이전에, 이전 챕터에서 보여줬던 Bootstrapper라는 구현부가 바로 등장하게 된다. 이전 챕터에서는 PrismBootStrapper를 상속한 Bootstrapper를 App.xaml에서 Onstatup을 오버라이딩한 곳에서 동적으로 생성하여 시작하였다.

그러나 이 Bootstrapper는 계속 상속관계를 확인하면

Application -> PrismApplicationBase -> PrismApplication -> BootStrapper

이므로 여기서는 App.cs가 PrismApplication을 상속하여 구현되어 있으므로 Base Class가 Application이므로 프로그램의 초기화에 아무런 문제가 없다.

또한, 이전챕터에서 확인할 수 있었던 Prism Container의 각 설정부분을 App.cs에서 바로 구현할 수 있다. 그래서 이 샘플은 Regions의 기능을 확인 할 수 있는 부분보다는 시작부의 Bootstrapper의 대한 구현부를 제대로 구현해서 이를 활용할 수있다는 것을 보여준다. 물른 상세한 설정은 샘플을 계속 확인하면 계속 나오니 이전 챕터들에 대한 개념을 확실히 알고 있어야 한다는것을 의미하고 있기도 하다.

그래서 시작(초기화)부분인 Bootstrapper은 이정도로 확인하고(계속 되는 샘플에서 계속 확인이 가능하다), Regions을 보자면,

MainWindow에서 특별한 코드를 확인할 수 있는데 이 부분이 Region을 설정한 부분이다.

Window의 클래스에 Grid UI Element가 있는데 Child로 ContentControl의 DependencyObject의 객체로 RegionManager클래스의 RegionName을 설정한것을 확인할 수 있다. (prism이 선언되어 있어야한다. xmlns:prism 선언부 확인)

즉, RegionManager이라는 DependecyObject를 이용하여 UI Element의 속성을 선언할 수있는데, 이중 Prism에서 제공하는 RegionManager가 있고 이 객체의 RegionName에 View의 Name을 설정하여, 추후 Prism Container가 동작하는 다른 구현부에서도 이 RegionName을 호출하여 View를 Control 할 수 있다.


이 챕터의 의미는 

  • View를 Region이라는 속성으로 관리할 수 있다.
  • RegionName을 설정할 수 있으므로 이름 관리가 가능하다.

여기서는 "View단에 특정 이름을 설정할 수 있다"라는 것까지만 보여주고 있다. 이후의 챕터에서 이를 이용한 UI 변경 및 Control을 보여주므로 Region이라는 개념이 있다라는 것을 기억하고 넘어가야한다.


끝.

'개발 > Prism' 카테고리의 다른 글

[Prism][WPFSample] Custom Regions  (0) 2021.07.19
[Prism][WPFSample] BootstrapperShell  (0) 2021.07.19
[Prism] WPF Sample  (0) 2021.07.19

Bootstrapper and the Shell : Create a basic bootstrapper and shell

App.xaml에 OnStartup을 오버라이딩해서 내부에 BootStrapper를 생성하여 실행한다.

해당 BootStrapper는 Prism이 제공한 PrismBootstrapper를 상속한 클래스를 호출한 것이었는데, 상속한 클래스는 아래와 같다.

즉, 각 함수들을 오버라이딩해서 필요한 부분을 확장해서 사용하라는 방식인것 같다.

 - CreateShell()은 Shell이라고 하는 각 동작단위를 생성하는 부분 같은데, 지금은 간단히 MainWindow를 등록하는것 같다.  Resolve에 MainWindow의 타입을 등록하면 아마도 초기에 해당 메인의 UI가 동작해야하는부분이 저 등록된 부분에 의해 시작되지 않을까 한다.

- RegisterTypes(...) 부분은 추후에 IContainerRegistry를 통해 PrismContainer에 등록해서 추후 컨테이너에 의해 다시 호출되어 사용될 수 있다. 이렇게 등록하고 추후 호출되어 사용되는 부분에 대한 샘플이 따로 있으니 거기서 확인하자.

 

이번은 첫 샘플이기 때문에 아마도 복잡한 내용은 없는듯 하다.

bootstrapper를 이용한 프리즘 초기화 방식과 이렇게 hello world 나오는 Window 창 띄울 수 있다. 이정도 인것 같다.


이번 쳅터의 의미는

  • Prism을 시작하는 PrismBootstrapper라는 개념
  • PrismBootStrapper에서 시작

으로 볼 수 있을것 같다.


끝.

'개발 > Prism' 카테고리의 다른 글

[Prism][WPFSample] Custom Regions  (0) 2021.07.19
[Prism][WPFSample] Regions  (0) 2021.07.19
[Prism] WPF Sample  (0) 2021.07.19

2021-07-18 기준 Prism WPF Sample을 기준으로 하나씩 분석해 보려 한다.

기본적인 사용법 이후에 Prism을 잘 사용하기 위한 방법을 확인해보려 한다.

문제는 Prism 라이브러리에 플러그인 중 

이런것이 있는데....(NOTE 참고), 플러그인 이라서 큰 문제는 안되나, 이렇게 가는게 맞는지는 모르겠다...

일단 메인을 기준으로 확인해보려 한다.

개념에 대한 설명은 사실 너무 옛날 버전들을 기준으로 Documents가 있어 그것을 보고 설명하기에는 너무 다른 내용들인것 같고, 일단은 WPF Sample 로 나온 코드를 기준으로 각 챕터별로 구분하여 확인하고자 한다. 

챕터가 무려 29번까지 있어 내용은 길어보일 수 있지만, 중복되는 내용 및 이전에 했던 챕터의 내용을 알고있다는 가정하에 다음챕터에서 활용하는 경우가 굉장히 많으므로 이를 숙지하고 넘어가야 한다.

sample URL은 https://github.com/PrismLibrary/Prism-Samples-Wpf 이며 WPF를 기준으로 설명하겠다.

끝.

'개발 > Prism' 카테고리의 다른 글

[Prism][WPFSample] Custom Regions  (0) 2021.07.19
[Prism][WPFSample] Regions  (0) 2021.07.19
[Prism][WPFSample] BootstrapperShell  (0) 2021.07.19

API 서비스 를 위해 구현중인데
초기에는 잘 연결되던 DB접속정보중 ConnectionString에 설정한 Password가 사라지는 현상이 발생했다.

그래서 DB내 SP 호출하는데 DB연결이 안되니 에러를 뱉는것이었다.

그래서 찾아보니 

https://stackoverflow.com/questions/12467335/connectionstring-loses-password-after-connection-open

 

ConnectionString loses password after connection.Open

i'm using ADO.NET to get some information from the database on a server, so this is what i do: string conStr = "Data Source=myServer\SQLEXPRESS;Initial Catalog=DBName;User ID=myUser;Password=myPas...

stackoverflow.com

당연히 오버플로에 있었고,

https://docs.microsoft.com/en-us/dotnet/api/system.data.sqlclient.sqlconnection.connectionstring?redirectedfrom=MSDN&view=netframework-4.7.2#System_Data_SqlClient_SqlConnection_ConnectionString 

 

SqlConnection.ConnectionString Property (System.Data.SqlClient)

Gets or sets the string used to open a SQL Server database.

docs.microsoft.com

해당 내용에 대한 MSDN,

즉, ConnectionString에 포함되는 키들 중에
Persist Security Info=true;
이걸 넣어야 된다는 것이었다. 즉, 생략하면 기본적으로 false이고, 이는 나중에 Password를 지운다라는 것이었으므로 시간이 지나 API를 다시 호출해보면 Password만 사라지는 현상이 있었던 것이다.

보안관련 이슈는 있을 수 있으니 관련 포스트들을 확인해야한다.

ps. MSDN을 다시한번 확인해보기

+ Recent posts