Service Manager 관리 팩 XML 파일 작업
관리 팩의 정교한 사용자 지정을 위해 Service Manager 콘솔 및 Service Manager 작성 도구로는 충분하지 않을 수 있으며 관리 팩 파일을 직접 작성하거나 수정해야 할 수 있습니다. 관리 팩 파일을 직접 사용하려면 System Center 공통 스키마 및 관리 팩 구조와 같은 여러 영역에 대한 심층적인 지식이 필요합니다.
이 섹션에서는 관리 팩을 작성하고 수정하여 Service Manager를 사용자 지정하는 데 도움이 되는 배경 정보 및 지침을 제공합니다.
System Center 공용 스키마 변경 내용
Service Manager에는 업데이트된 버전의 System Center 관리 팩 스키마가 포함되어 있습니다. 이제 이 스키마를 System Center 공통 스키마라고 하며, 기존 기능을 향상시키고 Service Manager 기능을 사용하도록 설정하기 위한 다양한 개선 사항과 추가 기능이 포함되어 있습니다. 이 문서에서는 System Center 공통 스키마의 변경 내용을 설명합니다.
속성 및 속성 제한
공통 스키마는 몇 가지 새로운 속성 유형을 통해 클래스를 확장합니다. 이러한 속성 형식에는 이진, 열거자 및 자동 증가 형식이 포함됩니다.
또한 특정 속성 값에 대한 제한 사항을 정의할 수 있습니다. 예를 들어 문자열 속성 값에 대한 정규식 제한 사항을 정의할 수 있습니다. 다음 예제에서 BuildingName 속성에는 정의된 정규식 제한이 있으므로 Building이라는 단어 뒤에 공백과 숫자가 포함된 값만 유효한 것으로 간주됩니다.
<ClassType ID="Lobby" Accessibility="Public" Base="System!System.Entity">
<Property ID="Id" Type="int" Key="true" />
<Property ID="BuildingName" Type="string" RegEx="Building [0-9]+" />
</ClassType>
이미지
이미지는 관리 팩 내에 저장되지 않습니다. 따라서 <PresentationTypes>
관리 팩의 섹션에는 더 이상 , <Image>
또는 <ImageData>
태그가 <Images>
포함되지 않습니다. 대신, 이미지 리소스를 사용합니다.
<Resources>
<Image ID="TestLibrary.Resources.Image1" Accessibility="Public" FileName="image.png"/>
</Resources>
열거형
공통 스키마는 열거형을 지원합니다. 열거형은 속성 또는 특성의 값을 제한하는 데 사용할 수 있는 값의 트리입니다.
각 열거에는 필요한 고유 ID 특성과 선택적인 Parent 특성이 포함됩니다.
다음 예에서 XBoxState 열거는 3가지 가능한 값인 실행 중, 중지됨 및 오류로 정의됩니다.
<EnumerationTypes>
<EnumerationValue ID="XBoxState" Accessibility="Public"/>
<EnumerationValue ID="XBoxState.Running" Parent="XBoxState" Accessibility="Public"/>
<EnumerationValue ID="XBoxState.Stopped" Parent="XBoxState" Accessibility="Public"/>
<EnumerationValue ID="XBoxState.Error" Parent="XBoxState" Accessibility="Public" />
<EnumerationValue ID="XBoxState.Error.RROD" Parent="XBoxState.Error" Accessibility="Public" />
</EnumerationTypes>
다음 예에서 Xbox 클래스는 enum 유형의 XBoxState속성을 정의합니다.
<ClassType ID="XBox" Accessibility="Public" Base="System!System.ConfigItem" Hosted="true">
<Property ID="Id" Type="int" Key="true" />
<Property ID="Name" Type="string" />
<Property ID="State" Type="enum" EnumType="XBoxState" />
</ClassType>
관계
관계 정의의 기능이 공통 스키마에서 개선되었습니다. RelationshipType 유형에는 이제 표시 이름으로 사용할 수 있는 Source 속성이 포함된 Target 및 ID 하위 요소가 있습니다. 또한 원본 및 대상 모두에 대한 최소 및 최대 카디널리티를 정의할 수 있습니다. 예를 들어 1 대 1 또는 0 대 다 관계입니다.
카디널리티는 관리 팩 유효성 검사 프로세스에 의해 적용되지 않지만 관리 팩에 대한 사용자 인터페이스를 정의하는 데 도움이 됩니다. 예를 들어 카디널리티를 확인하여 양식에 필드를 텍스트 상자 또는 목록으로 표시할지 여부를 결정할 수 있습니다.
Important
1보다 크게 정의된 모든 MaxCardinality 값은 무제한으로 처리됩니다.
사용자만의 관리 팩에서 새로운 관계 유형을 추가하는 경우 사용자는 새 관계 유형의 인스턴스를 만들도록 관계 유형의 원본 및 대상 클래스 인스턴스에 대한 모든 속성을 업데이트할 수 있는 충분한 권한을 보유해야 합니다.
다음 예제에서는 로비 유형과 Xbox 유형 간에 HasXboxes라는 호스팅 관계가 정의됩니다. 이 관계 정의에서 각 Lobby 유형은 여러 개의 Xbox 유형을 포함할 수 있습니다.
<RelationshipType ID="HasXBboxes" Accessibility="Public" Base="System!System.Hosting">
<Source ID="Source" Type="Lobby" />
<Target ID="Target" Type="Xbox" MinCardinality="0" MaxCardinality="9999" />
</RelationshipType>
조합 클래스
조합 클래스는 여러 테이블의 데이터를 반환할 수 있는 Microsoft SQL Server 데이터베이스에 정의된 보기와 비슷하게 관리 팩의 관련된 여러 유형에 대한 집계를 나타냅니다. 조합 클래스는 데이터베이스에 대한 하나의 작업으로 모든 집계 데이터를 저장 및 검색하며, 이러한 조합 클래스를 통해 관리 팩에 맞게 사용자 인터페이스를 더욱 쉽게 정의할 수 있습니다.
다음 예에서 프로젝션은 인시던트 관리 보기에 맞게 정의됩니다. 이 프로젝션은 인시던트와 관련된 몇 가지 구성 요소를 한 단위로 조합하므로, 양식 및 데이터베이스 작업에 더욱 쉽게 사용할 수 있습니다.
<TypeProjections>
<TypeProjection ID="System.WorkItem.Incident.View.ProjectionType"
Accessibility="Public" Type="Incident!System.WorkItem.Incident">
<Component Alias="AffectedUser"
Path="$Target/Path[Relationship='SMCore!System.WorkItemCreatedForUser']$"/>
<Component Alias="AssignedUser" Path="$Target/Path[Relationship='SMCore!System.WorkItemAssignedToUser']$"/>
</TypeProjection>
<TypeProjection ID="System.WorkItem.Incident.View.DCMProjectionType" Accessibility="Public" Type="Incident!System.WorkItem.Incident.DCMIncident">
<Component Alias="AffectedUser" Path="$Target/Path[Relationship='SMCore!System.WorkItemCreatedForUser']$"/>
<Component Alias="AssignedUser" Path="$Target/Path[Relationship='SMCore!System.WorkItemAssignedToUser']$"/>
<!--Baseline and Configuration Item Information-->
<Component Alias="AffectedComputer" Path="$Target/Path[Relationship='Incident!System.WorkItem.Incident.DCMIncident.Refers.NonComplianceComputer']$"/>
</TypeProjection>
<TypeProjection ID="System.WorkItem.ChangeRequestViewProjection" Accessibility="Public" Type="System.WorkItem.ChangeRequest">
<Component Alias="AssignedTo" Path="$Target/Path[Relationship='SMCore!System.WorkItemAssignedToUser']$"/>
</TypeProjection>
<TypeProjection ID="System.WorkItem.ChangeRequestProjection" Accessibility="Public" Type="System.WorkItem.ChangeRequest">
<Component Alias="Activity" Path="$Target/Path[Relationship='SMActivity!System.WorkItemContainsActivity']$">
<Component Alias="ActivityAssignedTo" Path="$Target/Path[Relationship='SMCore!System.WorkItemAssignedToUser']$"/>
<Component Alias="ActivityRelatedWorkItem" Path="$Target/Path[Relationship='SMCore!System.WorkItemRelatesToWorkItem']$">
<Component Alias="ActivityRelatedWorkItemAssignedTo" Path="$Target/Path[Relationship='SMCore!System.WorkItemAssignedToUser']$"/>
</Component>
<Component Alias="ActivityRelatedConfigItem" Path="$Target/Path[Relationship='SMCore!System.WorkItemRelatesToConfigItem']$"/>
<Component Alias="ActivityAboutConfigItem" Path="$Target/Path[Relationship='System!System.WorkItemAboutConfigItem']$"/>
<Component Alias="ActivityFileAttachment" Path="$Target/Path[Relationship='System!System.WorkItemHasFileAttachment']$">
<Component Alias="ActivityFileAttachmentAddedBy" Path="$Target/Path[Relationship='System!System.FileAttachmentAddedByUser']$"/>
</Component>
<Component Alias="Reviewer" Path="$Target/Path[Relationship='SMActivity!System.ReviewActivityHasReviewer']$">
<Component Alias="User" Path="$Target/Path[Relationship='SMActivity!System.ReviewerIsUser']$"/>
<Component Alias="VotedBy" Path="$Target/Path[Relationship='SMActivity!System.ReviewerVotedByUser']$"/>
</Component>
</Component>
<Component Alias="CreatedBy" Path="$Target/Path[Relationship='SMCore!System.WorkItemCreatedByUser']$"/>
<Component Alias="AssignedTo" Path="$Target/Path[Relationship='SMCore!System.WorkItemAssignedToUser']$"/>
<Component Alias="CreatedFor" Path="$Target/Path[Relationship='SMCore!System.WorkItemCreatedForUser']$"/>
<Component Alias="RelatedWorkItem" Path="$Target/Path[Relationship='SMCore!System.WorkItemRelatesToWorkItem']$">
<Component Alias="RelatedWorkItemAssignedTo" Path="$Target/Path[Relationship='SMCore!System.WorkItemAssignedToUser']$"/>
</Component>
<Component Alias="RelatedConfigItem" Path="$Target/Path[Relationship='SMCore!System.WorkItemRelatesToConfigItem']$"/>
<Component Alias="AboutConfigItem" Path="$Target/Path[Relationship='System!System.WorkItemAboutConfigItem']$"/>
<Component Alias="FileAttachment" Path="$Target/Path[Relationship='System!System.WorkItemHasFileAttachment']$">
<Component Alias="FileAttachmentAddedBy" Path="$Target/Path[Relationship='System!System.FileAttachmentAddedByUser']$"/>
</Component>
</TypeProjection>
<TypeProjection ID="System.FileAttachmentProjection" Accessibility="Public" Type="System!System.FileAttachment">
<Component Alias="FileAttachmentAddedBy" Path="$Target/Path[Relationship='System!System.FileAttachmentAddedByUser']$"/>
</TypeProjection>
</TypeProjections>
콘솔 작업
콘솔 작업은 공통 스키마에서 확장됩니다. 이전에 콘솔 작업은 애플리케이션 디렉터리 및 실행 파일 이름의 단순한 포인터였습니다. 콘솔 작업은 이제 Microsoft .NET Framework 어셈블리에서 처리기 코드로 구현됩니다. 처리기 코드는 코드, 처리기 이름 및 명명된 값의 목록(처리기에 인수로 전달될 수 있음)을 포함하는 어셈블리를 참조합니다.
다음 예에서 Some.Handler.Name 처리기는 MyLibrary.Resources.Assembly 어셈블리에 정의됩니다. 처리기 매개 변수 및 값의 목록도 정의됩니다.
<ConsoleTask ID="MyLibrary.ConsoleTasks.T1"
Accessibility="Public"
Target="System!System.Entity"
Enabled="true"
RequireOutput="true">
<Assembly>MyLibrary.Resources.Assembly1</Assembly>
<Handler>Some.Handler.Name</Handler>
<Parameters>
<Argument Name="Application">cmd.exe</Argument>
<Argument Name="WorkingDirectory">%TEMP%</Argument>
<Argument>test1</Argument>
<Argument>test2</Argument>
</Parameters>
</ConsoleTask>
리소스
이진 데이터는 관리 팩에 직접 저장되지 않습니다. 대신 이진 리소스에 대한 메타데이터는 관리 팩에 저장되며, 실제 이진 데이터는 리소스 파일 외부에 저장됩니다. 메타데이터에는 고유한 식별자, 파일 이름, 생성 날짜, 수정된 날짜 및 접근성 정보가 포함됩니다.
이진 데이터에는 일반 리소스, 이미지, 어셈블리, 보고서 정의 및 양식이 포함될 수 있습니다. 다음 예에서는 일반 XML 리소스, 어셈블리 리소스 및 보고서 리소스를 보여 줍니다.
<Resources>
<Resource ID="TestLibrary.Resources.Test1" Accessibility="Public" FileName="res1.xml"/>
<Resource ID="TestLibrary.Resources.Test2" Accessibility="Public" FileName="res2.xml"/>
<Assembly ID="TestLibrary.Resources.Assembly1" Accessibility="Public" QualifiedName="Baz, Version=1.0.0.0" FileName="baz.dll"/>
<Assembly ID="TestLibrary.Resources.Assembly2" Accessibility="Public" QualifiedName="Yoyo, Version=1.0.0.0" FileName="yoyo.dll">
<Dependency ID="TestLibrary.Resources.Assembly1"/>
</Assembly>
<ReportResource ID="TestLibrary.Resources.Report1" Accessibility="Public" MIMEType="text/xml" FileName="res1.xml"/>
<Image ID="TestLibrary.Resources.Image1" Accessibility="Public" FileName="image.png"/>
</Resources>
폼
양식은 관리 팩에 정의됩니다. 양식을 사용하여 유형 또는 조합 클래스의 단일 인스턴스를 보고 수정할 수 있습니다.
양식은 WPF(Windows Presentation Framework)를 기반으로 하며 어셈블리에 정의됩니다. 관리 팩에 대한 양식 구현을 포함하는 어셈블리 및 클래스는 관리 팩의 리소스 섹션에 포함됩니다. 새 공통 스키마를 사용하는 관리 팩의 모든 이진 리소스와 마찬가지로 관리 팩 자체에는 양식에 대한 이진 데이터가 포함되지 않습니다. 리소스 매니페스트만 관리 팩에 지정됩니다.
관리 팩의 양식에 대해 사용자만의 구성 정보를 지정할 수 있습니다. 다음 예에서 구성 섹션에는 ShowXboxes 속성이 포함됩니다. 이 구성 정보는 관리 팩 확인 프로세스에서 평가되지 않습니다. 양식 구현에서만 해석됩니다.
<Forms>
<Form ID="LobbyForm" Target="Projection" Assembly="FormAssembly" TypeName="MyFormClass">
<Configuration>
<ShowXboxes>yes</ShowXboxes>
</Configuration>
</Form>
</Forms>
프로젝터를 관리하는 관리 팩 파일 작성
관리 팩은 Service Manager의 기능을 직접 지정하고 확장하는 데 사용됩니다. 이 문서에서는 관리 팩의 다양한 섹션을 설명하고 조직에서 프로젝터를 관리하는 데 필요한 다양한 개체를 정의하는 예제로 프로젝터를 사용합니다.
이 문서에는 조직의 프로젝터를 관리하는 데 필요한 확장이 포함된 전체 관리 팩 샘플이 포함되어 있습니다. 또한 Windows PowerShell cmdlet을 사용하여 관리 팩을 가져오는 방법을 설명합니다.
이 문서에서는 관리 팩의 다음 섹션을 설명합니다.
매니페스트
클래스 열거 및 관계를 만드는 TypeDefinitions
폼
또한 이 문서에서는 UI(사용자 인터페이스) 및 지역화 요소에 대한 선언 및 정의를 포함하는 관리 팩의 다음 섹션을 설명합니다.
범주
프레젠테이션
클래스 확장
매니페스트 섹션
관리 팩의 첫 번째 섹션에 매니페스트가 포함됩니다. 매니페스트는 관리 팩을 식별하고 다른 관리 팩에 대한 모든 참조를 선언합니다.
다음 예에서는 조직에서 프로젝터를 추적하도록 설계된 관리 팩의 Manifest 섹션을 보여 줍니다.
<Manifest>
<Identity>
<ID>ServiceManager.Projector_Authoring</ID>
<Version>7.0.3707.0</Version>
</Identity>
<Name>Projector Library</Name>
<References>
<Reference Alias="System">
<ID>System.Library</ID>
<Version>7.0.3707.0</Version>
<PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
</Reference>
<Reference Alias="SMConsole">
<ID>Microsoft.EnterpriseManagement.ServiceManager.UI.Console</ID>
<Version>7.0.3707.0</Version>
<PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
</Reference>
<Reference Alias="Authoring">
<ID>Microsoft.EnterpriseManagement.ServiceManager.UI.Authoring</ID>
<Version>7.0.3707.0</Version>
<PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
</Reference>
<Reference Alias="SMConfig">
<ID>ServiceManager.ConfigurationManagement.Library</ID>
<Version>7.0.3707.0</Version>
<PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
</Reference>
</References>
</Manifest>
Important
참조 섹션에서 참조의 별칭에서 '.'와 같은 무수 값을 사용하지 마세요.
TypeDefinitions 섹션에서 클래스 만들기
관리 팩의 다음 섹션에 유형 정의가 포함됩니다. 관리 팩의 TypeDefinitions 섹션에는 관리 팩에 사용되는 클래스, 열거 및 관계에 대한 정의가 포함됩니다.
다음 예에서는 프로젝터에 대한 정보를 포함하는 클래스를 보여 줍니다.
<TypeDefinitions>
<EntityTypes>
<ClassTypes>
<ClassType ID="System.ConfigItem.Projector" Base="System!System.ConfigItem" Hosted="false" Accessibility="Public" Abstract="false">
<Property ID="SerialNumber" Type="int" Key="true" />
<Property ID="Make" Type="string" />
<Property ID="Model" Type="string" />
<Property ID="Location" Type="string" />
<Property ID="Condition" Type="enum" EnumType="ProjectorCondition" />
</ClassType>
</ClassTypes>
<RelationshipTypes>
</RelationshipTypes>
<EnumerationTypes>
<EnumerationValue ID="ProjectorCondition" Accessibility="Public"/>
<EnumerationValue ID="ProjectorCondition.Working" Parent="ProjectorCondition" Accessibility="Public"/>
<EnumerationValue ID="ProjectorCondition.BeingRepaired" Parent="ProjectorCondition" Accessibility="Public"/>
<EnumerationValue ID="ProjectorCondition.New" Parent="ProjectorCondition" Accessibility="Public"/>
<EnumerationValue ID="ProjectorCondition.Broken" Parent="ProjectorCondition" Accessibility="Public"/>
<EnumerationValue ID="ProjectorViewTasksEnumeration" Accessibility="Public"/>
</EnumerationTypes>
</EntityTypes>
</TypeDefinitions>
다음은 유형 정의에 포함되는 내용에 대한 섹션별 설명입니다.
ClassTypes 섹션
ClassType 요소는 다음과 같이 프로젝터 클래스를 정의합니다.
<ClassType ID="System.ConfigItem.Projector" Base="System!System.ConfigItem" Hosted="false" Accessibility="Public" Abstract="false">
ID 특성은 이 클래스의 고유한 식별자이며, 다음으로 설정됩니다.
ID="System.ConfigItem.Projector"
Base 특성은 이 클래스가 파생되는 클래스의 ID입니다. 프로젝터는 구성 항목의 한 종류이므로 다음과 같이 설정됩니다.
Base="System!System.ConfigItem"
System!의 표기법은 이 클래스 System.ConfigItem이 별칭 시스템에서 참조하는 관리 팩에 있음을 나타냅니다.
Hosted 특성은 이 클래스가 다른 클래스에 호스트되는지 여부를 정의합니다. 이 경우 이 클래스의 인스턴스는 해당 인스턴스를 포함하는 호스트 인스턴스가 존재하는 경우에만 존재할 수 있습니다. 이 예제에서는 프로젝터가 호스트되지 않습니다. 따라서 Hosted 특성은 false로 설정됩니다.
Hosted="false"
Hosted 특성을 true 로 설정하면 클래스가 다른 클래스에 호스트되는 것을 나타냅니다. 호스트 관계는 RelationshipTypes 섹션에서 선언해야 합니다.
Accessibility 특성은 다른 클래스가 이 클래스에서 파생될 수 있는지 여부를 정의합니다. 다른 사용자가 클래스의 특정 버전을 만들 수 있도록 하려는 경우 이 특성을 public으로 설정하십시오. 예를 들면 다음과 같습니다.
Accessibility="Public"
Accessibility 특성을 Internal 로 설정하면 다른 클래스가 이 클래스에서 파생될 수 없습니다.
Abstract 특성은 이 클래스의 인스턴스를 생성할 수 있는지 여부 또는 클래스를 파생할 다른 클래스의 부모 클래스로 사용해야 하는지 여부를 정의합니다. 이 예에서 이 특성은 false로 설정됩니다. 이 특성을 true 로 설정하면 이 클래스의 인스턴스를 직접 생성할 수 없으며 이 클래스는 부모 클래스로만 사용할 수 있습니다.
클래스 정의의 다음 섹션에는 클래스 속성이 포함됩니다. 이 예에 대한 클래스 속성을 정의하는 XML은 다음 코드 예에서 정의됩니다.
<Property ID="SerialNumber" Type="int" Key="true" />
<Property ID="Make" Type="string" />
<Property ID="Model" Type="string" />
<Property ID="Location" Type="string" />
<Property ID="Condition" Type="enum" EnumType="ProjectorCondition" />
각 Property 요소에는 다음과 같은 특성이 있습니다.
ID 특성은 속성의 고유한 식별자를 지정합니다.
Type 특성은 속성의 데이터 형식을 나타냅니다.
Key 특성. 이 특성을 true 로 설정하면 이 속성이 이 클래스를 고유하게 식별하는 데 사용된다는 것을 나타냅니다.
열거형 형식 만들기
enum 데이터 형식의 열거는 특수한 데이터 형식입니다. 열거는 값의 특정 집합에 대한 속성에 허용되는 데이터를 제한하는 데 사용됩니다. 열거는 계층적일 수 있습니다. 즉, 한 열거가 다른 열거에 기반할 수 있습니다.
열거는 솔루션 팩의 EnumertionTypes 섹션에 정의됩니다. 열거 정의에는 루트 열거와 실제 열거 값이 차례로 포함됩니다.
각 EnumerationValue 는 몇 가지 특성을 허용합니다.
이 예에서 열거는 프로젝터의 조건을 계속 추적하도록 정의됩니다. 다음에서 이 열거를 정의합니다.
ID 는 열거 또는 열거 값의 식별자입니다.
Accessibility 는 이 열거자가 다른 열거자를 포함할 수 있는지 여부를 지정합니다.
ParentName 은 열거자 값의 부모 ID 를 지정하는 특성입니다.
<EnumerationTypes>
<EnumerationValue ID="ProjectorCondition" Accessibility="Public"/>
<EnumerationValue ID="ProjectorCondition.Working" Parent="ProjectorCondition" Accessibility="Public"/>
<EnumerationValue ID="ProjectorCondition.BeingRepaired" Parent="ProjectorCondition" Accessibility="Public"/>
<EnumerationValue ID="ProjectorCondition.New" Parent="ProjectorCondition" Accessibility="Public"/>
<EnumerationValue ID="ProjectorCondition.Broken" Parent="ProjectorCondition" Accessibility="Public"/>
<EnumerationValue ID="ProjectorViewTasksEnumeration" Accessibility="Public"/>
</EnumerationTypes>
양식 만들기
Service Manager 양식은 WPF(Windows Presentation Framework) 양식을 기반으로 합니다. Service Manager는 XML 정의에 추가되는 간단한 특성으로 WPF를 확장하고 Service Manager가 관리 팩의 데이터를 양식에 바인딩할 수 있도록 합니다.
Service Manager 양식은 Microsoft Visual Studio 또는 Microsoft Expression Blend를 비롯한 여러 가지 도구를 사용하여 만들 수 있습니다. 양식이 XML에 기반이므로 임의의 XML 편집기를 사용하여 정의할 수 있습니다.
다음 예에서는 Microsoft Expression Blend를 사용하여 생성된 양식 정의를 보여 줍니다. 이 양식에는 위에서 정의된 Projector 클래스 속성에 바인딩되는 네 가지 컨트롤, 세 가지 텍스트 상자 및 하나의 콤보 상자가 포함됩니다.
<UserControl xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:SMFormsDemo" x:Class="SMFormsDemo.TestControl" x:Name="Control" Width="574" Height="390" Opacity="1" xmlns:d="https://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" Background="{DynamicResource {x:Static SystemColors.WindowBrushKey}}">
<UserControl.Resources>
<ObjectDataProvider ObjectType="{x:Type local:helper}" MethodName="GetStatusValues" x:Key="getStatusValues"/>
</UserControl.Resources>
<Grid x:Name="LayoutRoot">
<Label Margin="70,20,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" Content="Serial Number:"/>
<TextBox Margin="180,20,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" d:IsStaticText="True" Text="{Binding Path=SerialNumber, Mode=TwoWay}"/>
<Label Margin="70,60,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" Content="Make:"/>
<TextBox Margin="180,60,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" d:IsStaticText="True" Text="{Binding Path=Make, Mode=TwoWay}"/>
<Label Margin="70,100,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" Content="Model:"/>
<TextBox Margin="180,100,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" d:IsStaticText="True" Text="{Binding Path=Model, Mode=TwoWay}"/>
<Label Margin="70,140,80,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" Content="Location:"/>
<TextBox Margin="180,140,80,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" d:IsStaticText="True" Text="{Binding Path=Location, Mode=TwoWay}"/>
<Label Margin="70,180,80,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" Content="Condition:"/>
<ComboBox Margin="180,180,80,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" ItemsSource="{Binding Source={StaticResource getStatusValues}, Mode=OneWay }" IsSynchronizedWithCurrentItem="True">
<ComboBox.SelectedItem>
<Binding Path="Condition" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged"/>
</ComboBox.SelectedItem>
<ComboBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding Path=DisplayName}"/>
</StackPanel>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
</Grid>
</UserControl>
양식의 컨트롤을 관리 팩에 정의된 클래스 속성에 바인딩할 수 있도록 하려면 여러 항목을 지정해야 합니다.
텍스트 컨트롤 바인딩
관리 팩의 클래스 속성에 텍스트 상자를 바인딩하려면 텍스트 상자 컨트롤의 Text 속성에 바인딩 경로 태그를 추가합니다. 예를 들면 다음과 같습니다.
{Binding Path=SerialNumber, Mode=TwoWay}
이 태그는 관리 팩에 정의된 Projector 클래스의 SerialNumber 속성에 텍스트 상자 컨트롤을 바인딩하며 이를 양방향 바인딩으로 지정합니다. 속성 값은 데이터베이스에서 검색되고 폼이 로드될 때 텍스트 상자에 표시되며 사용자가 변경한 경우 속성 값이 데이터베이스에 다시 저장됩니다.
바인딩 콤보 상자
양식이 기본 관리 팩에서 열거 데이터를 검색하고 양식의 컨트롤에 바인딩할 수 있도록 하려면 양식의 code-behind 에서 도우미 클래스를 정의해야 합니다. 이 도우미 클래스에는 관리 팩에 정의된 열거를 반환하는 메서드가 포함되어야 합니다. 열거를 반환하려면 현재 관리 팩의 GetEnumerations 메서드를 사용하십시오. 이 인스턴스는 Service Manager SDK(소프트웨어 개발 키트)에서 ConsoleContextHelper 클래스로 액세스됩니다. 다음 예에서 도우미 클래스는 관리 팩에 정의된 GetStatusValues 열거의 값을 검색하는 ProjectorCondition 메서드를 정의합니다.
public class helper
{
public static ICollection<IDataItem> GetStatusValues()
{
return ConsoleContextHelper.Instance.GetEnumerations("ProjectorCondition",true);
}
}
이 메서드에 액세스하려면 관리 팩의 양식 정의에서 몇 가지를 정의해야 합니다.
먼저, 양식에 대한 code behind 의 네임스페이스를 가리키는 네임스페이스가 양식 정의에 추가됩니다. 이 예에서 네임스페이스는 SMFormsDemo입니다.
xmlns:local="clr-namespace:SMFormsDemo"
그런 다음, 프로젝터 상태를 표시하는 콤보 상자의 값을 제공하도록 ObjectDataProvider 를 정의해야 합니다. ObjectDataProvider 가 원본으로 정의됩니다.
<UserControl.Resources>
<ObjectDataProvider
ObjectType="{x:Type local:helper}"
MethodName="GetStatusValues"
x:Key="getStatusValues" />
</UserControl.Resources>
이 데이터 공급자는 관리 팩에서 열거 값을 검색하는 개체 및 메서드 이름을 지정합니다.
마지막으로 관리 팩에 정의된 열거 값에 콤보 상자를 바인딩하려면 ItemsSource 특성이 콤보 상자 정의에 추가됩니다. 이 특성은 예를 들어 열거 값을 검색할 위치를 지정합니다.
ItemsSource="{Binding Source={StaticResource getStatusValues}, Mode=OneWay }"
그런 다음, SelectedItem 및 ItemTemplate 요소가 콤보 상자 컨트롤의 XAML(Extensible Application Markup Language) 정의에 추가됩니다. 다음 예는 바인딩 XAML이 포함한 콤보 상자 정의를 보여 줍니다.
<ComboBox Margin="180,180,80,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" ItemsSource="{Binding Source={StaticResource getStatusValues}, Mode=OneWay }" IsSynchronizedWithCurrentItem="True">
<ComboBox.SelectedItem>
<Binding Path="Condition" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged"/>
</ComboBox.SelectedItem>
<ComboBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding Path=DisplayName}"/>
</StackPanel>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
범주 섹션
관리 팩의 Category 섹션은 쉽게 탐색할 수 있도록 관리 팩 요소를 함께 그룹화합니다.
예제의 처음 두 <Category>
요소는 프로젝터 보기에서 새로 만들기 및 편집 작업의 표시를 제어하는 데 사용됩니다.
<Category ID="ProjectorViewHasTasks.View" Target="AllProjectorsView" Value="ProjectorViewTasksEnumeration" />
<Category ID="ProjectorViewHasTasks.CreateTask" Target="CreateProjector" Value="ProjectorViewTasksEnumeration" />
예제 관리 팩의 두 번째 범주 요소는 Service Manager 콘솔의 제작 창에 있는 목록 보기에 프로젝터 조건 열거형을 표시하는 데 사용됩니다. 이 요소를 통해 사용자는 다음과 같이 값을 사용자 지정할 수 있습니다.
<Category ID="Project.ProjectorConditionEnumVisibleCategory" Target="ProjectorCondition" Value="System!VisibleToUser"/>
다음 예제에서 이 범주를 추가하면 Target 특성에 지정된 EnumerationValue 에 대한 목록 보기에 편집 작업이 표시됩니다.
<Category ID="Projector.ProjectorConditionCategory" Target="ProjectorCondition" Value="Authoring!Microsoft.EnterpriseManagement.ServiceManager.UI.Authoring.EnumerationViewTasks"/>
프레젠테이션 섹션
관리 팩의 Presentation 섹션은 사용자 인터페이스 관련 요소를 선언 및 정의합니다. 여기에는 양식 선언, 범주 및 콘솔 작업이 포함됩니다.
양식 섹션
Forms 섹션은 관리 팩에 사용되는 양식을 선언합니다. 다음 예는 Projector 클래스의 인스턴스를 표시 및 편집할 수 있도록 정의된 양식을 검색할 위치를 지정합니다. 그렇게 하면 양식이 관리 팩에 정의된 프로젝터 클래스에 바인딩됩니다.
<Forms>
<Form TypeName="SMFormsDemo.TestControl"
ID="TestForm"
Target="System.ConfigItem.Projector"
Assembly="ProjectorFormsAssembly"
Accessibility="Public">
<Category>Form</Category>
</Form>
</Forms>
위의 예에서는 다음 특성이 사용됩니다.
TypeName 특성에는 양식의 네임스페이스 및 클래스 이름이 포함됩니다.
ID 특성에는 이 양식 인스턴스의 고유한 식별자가 포함됩니다.
Target 특성에는 이 양식이 바인딩되는 클래스의 이름이 포함됩니다.
Assembly 특성은 양식을 포함하는 외부 리소스를 가리킵니다.
Accessibility 특성은 이 양식을 사용자 지정할 수 있는지 여부를 정의합니다.
뷰 정의
관리 팩의 Views 섹션에는 UI(사용자 인터페이스) 보기의 정의가 포함됩니다. 이러한 보기는 관리 팩의 개체를 필터링 및 표시하는 데 사용할 수 있습니다.
<View Target="System.ConfigItem.Projector"
Enabled="true"
TypeID="SMConsole!GridViewType"
ID="AllProjectorsView"
Accessibility="Public">
<Category>NotUsed</Category>
<Data>
<Adapters>
<Adapter AdapterName="dataportal:EnterpriseManagementObjectAdaptor">
<AdapterAssembly>Microsoft.EnterpriseManagement.UI.SdkDataAccess</AdapterAssembly>
<AdapterType>
Microsoft.EnterpriseManagement.UI.SdkDataAccess.DataAdapters.EnterpriseManagementObjectAdapter
</AdapterType>
</Adapter>
<Adapter AdapterName="viewframework://adapters/ListDefault">
<AdapterAssembly>Microsoft.EnterpriseManagement.UI.ViewFramework</AdapterAssembly>
<AdapterType>Microsoft.EnterpriseManagement.UI.ViewFramework.ListSupportAdapter</AdapterType>
</Adapter>
</Adapters>
<ItemsSource>
<AdvancedListSupportClass DataTypeName="" AdapterName="viewframework://adapters/AdvancedList" FullUpdateAdapter="dataportal:EnterpriseManagementObjectAdapter" FullUpdateFrequency='1' DataSource="mom:ManagementGroup" IsRecurring="true" RecurrenceFrequency="5000" treaming='true' xmlns="clr-namespace:Microsoft.EnterpriseManagement.UI.ViewFramework;assembly=Microsoft.EnterpriseManagement.UI.ViewFramework" xmlns:av="https://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" >
<AdvancedListSupportClass.Parameters>
<QueryParameter Parameter="TargetClass" Value="System.ConfigItem.Projector"/>
</AdvancedListSupportClass.Parameters>
</AdvancedListSupportClass>
</ItemsSource>
<Criteria />
</Data>
<Presentation>
<Columns>
<mux:ColumnCollection xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:mux="https://schemas.microsoft.com/SystemCenter/Common/UI/Views/GridView" xmlns:s="clr-namespace:System;assembly=mscorlib">
<mux:Column Name="SerialNumber" DisplayMemberBinding="{Binding Path=SerialNumber}" Width="100" DisplayName="SerialNumber" Property="SerialNumber" DataType="s:Int32" />
<mux:Column Name="Location" DisplayMemberBinding="{Binding Path=Location}" Width="100" DisplayName="Location" Property="Location" DataType="s:String" />
<mux:Column Name="Condition" DisplayMemberBinding="{Binding Path=Condition.DisplayName}" Width="100" DisplayName="Condition" Property="Condition.DisplayName" DataType="s:String" />
<mux:Column Name="DisplayName" DisplayMemberBinding="{Binding Path=DisplayName}" Width="100" DisplayName="Display Name" Property="DisplayName" DataType="s:String" />
<mux:Column Name="OwnerUser" DisplayMemberBinding="{Binding Path=OwnerUser.DisplayName}" Width="100" DisplayName="SupportOwner" Property="OwnerUser.DisplayName" DataType="s:String" />
</mux:ColumnCollection>
</Columns>
</Presentation>
</View>
View Target 특성은 보기에서 표시하는 데 사용하는 클래스를 가리킵니다.
위의 예에서는 Service Manager 콘솔 관리 팩을 참조합니다. 이 관리 팩에는 사용 중인 보기 유형의 정의가 포함됩니다. 이 인스턴스에서 SMConsole!GridViewType 보기 유형이 정의됩니다.
AdvancedListSupportClass 는 여러 매개 변수(특히 TargetClass 매개 변수가 가장 중요)를 정의합니다. 이 매개 변수를 이 보기에 표시할 ID 의 ClassType 로 설정합니다. ClassType의 속성인 열을 표시하려면 Column 요소를 사용하여 PropertyID 특성에 바인딩합니다.
IsRecurring 요소의 ListSupportClass 특성은 보기가 자동으로 새로 고쳐지는지 여부를 결정합니다. RecurrenceFrequency 특성은 새로 고침 간격을 밀리초로 정의합니다. 이 예제에서는 새로 고침 간격이 1초로 설정되지만 프로덕션 설치에는 권장되지 않습니다.
폴더 정의
폴더를 정의하면 보기가 표시되는 탐색 트리의 위치가 결정됩니다. 이 예제에서는 구성 항목이 구성 항목 작업 영역의 구성 항목에 대한 기존 폴더 아래에 보기를 배치하는 데만 적합하도록 정의됩니다.
<Folders>
<Folder ID="Folder.Projectors" Accessibility="Public" ParentFolder="SMConfig!ServiceManager.Console.ConfigurationManagement.ConfigItem.Root" />
</Folders>
<FolderItems>
<FolderItem
ElementID="AllProjectorsView"
Folder="Folder.Projectors" />
</FolderItems>
위의 예에서 ElementID 특성에는 생성된 보기에 대한 참조가 포함됩니다. 폴더 특성은 Folders.Projectors 폴더를 가리키며, 이 폴더에는 Service Manager 콘솔의 구성 관리 작업 영역에 정의된 대로 루트가 있습니다. 이 루트 폴더는 "구성 관리" 관리 팩에서 정의됩니다.
ImageReference 요소는 이전에 생성된 보기를 Configuration Management 네임스페이스에 정의된 아이콘에 매핑합니다.
<ImageReferences>
<ImageReference ElementID="Folder.Projectors" ImageID="SMConfig!ConfigItemImage16x16" />
<ImageReference ElementID="AllProjectorsView" ImageID="SMConfig!ConfigItemImage16x16" />
</ImageReferences>
LanguagePacks 섹션을 사용한 지역화
관리 팩의 LanaguagePacks 섹션은 문자열 리소스 및 관리 팩 요소의 매핑을 정의합니다.
예제에서 EnumerationValueProjectorCondition.Working은 작업으로 표시되어야 합니다. 이렇게 하려면 다음에 대한 표시 이름을 각기 정의해야 합니다.
보기: 모든 프로젝터
열거형: 작업, 끊어짐, 복구 중, 신규
<LanguagePacks>
<LanguagePack ID="ENU" IsDefault="true">
<DisplayStrings>
<DisplayString ElementID="AllProjectorsView">
<Name>All Projectors</Name>
<Description>This displays all projectors</Description>
</DisplayString>
<DisplayString ElementID="ProjectorCondition.Working">
<Name>Working</Name>
</DisplayString>
<DisplayString ElementID="ProjectorCondition.Broken">
<Name>Broken</Name>
</DisplayString>
<DisplayString ElementID="ProjectorCondition.BeingRepaired">
<Name>In Repair</Name>
</DisplayString>
<DisplayString ElementID="ProjectorCondition.New">
<Name>New</Name>
</DisplayString>
</DisplayStrings>
</LanguagePack>
</LanguagePacks>
필요한 각 언어에 대해 필요한 추가 LanguagePack 요소를 만들 수 있습니다. 사용자의 로캘에 따라 올바른 표시 문자열이 사용자에게 표시됩니다.
리소스
관리 팩의 Resources 섹션에는 관리 팩과 분리되는 어셈블리에 포함된 이진 리소스에 대한 참조가 포함됩니다. 다음 예에서 리소스는 프로젝터 클래스에 사용되는 양식을 포함하는 어셈블리를 가리키는 것으로 정의됩니다.
<Assembly ID="ProjectorFormsAssembly"
Accessibility="Public"
QualifiedName="SMFormsDemo, Version=1.0.0.0" FileName="SMFormsDemo.dll" CreationDate="1900-10-12T13:13:13" ModifiedDate="2008-12-12T12:12:12" />
클래스 확장
클래스 확장은 기존 클래스에 속성을 추가하는 클래스입니다. 대부분의 경우 기존 클래스는 봉인된 관리 팩에 있습니다. 기존 클래스가 봉인된 관리 팩에 없는 경우 확장 중인 클래스와 동일한 관리 팩에 클래스 확장이 포함되어야 합니다.
클래스 확장은 모든 부모 클래스의 속성을 상속합니다. 예를 들면 다음과 같습니다.
클래스 A에 Property1이라는 속성이 있습니다.
클래스 B는 클래스 A에서 파생되거나 확장되므로 Property1이라는 속성을 포함합니다. 이 속성은 클래스 A, 부모 또는 기본 클래스에서 상속됩니다.
클래스 B에 대한 정의는 Property2라는 속성을 추가합니다.
클래스 B에서 파생되는 모든 클래스 확장은 Property1과 Property2를 상속합니다.
다음 예는 클래스 확장 정의를 나타냅니다.
<TypeDefinitions>
<EntityTypes>
<ClassTypes>
<ClassType ID="IncidentManagmentPack.Extension" Accessibility="Public" Base="Incident!System.WorkItem.Incident" Hosted="false" IsExtensionType="true">
<Property ID="TimeOnIncident" Type="int" Key="false" />
</ClassType>
</ClassTypes>
</EntityTypes>
</TypeDefinitions>
이 클래스 확장은 System.WorkItem.Incident 클래스를 확장하고 TimeOnIncident라는 새 속성을 추가합니다.
클래스 확장에 대한 정의는 클래스 정의와 비슷합니다. 클래스 정의를 정의하는 데 사용되는 ClassType 요소의 두 가지 특성은 Base 특성과 IsExtensionType 특성입니다.
Base 특성은 클래스 확장이 파생되는 부모 클래스의 ID 를 지정합니다. 이 경우 특성 값은 Incident!System.WorkItem.Incident로 설정됩니다. 이 값에는 확장 중인 클래스, 느낌표, 기본 클래스의 이름을 포함하는 전체 관리 팩 이름의 Alias 가 포함됩니다. 자세한 내용은 다음 예를 참조하십시오.
IsExtensionType 특성은 이 클래스가 기본 클래스의 확장인지 여부를 정의합니다. TimeOnIncident 가 Incident 클래스의 확장이므로, 이 속성은 true로 설정됩니다.
IsExtensionType="true"
다른 옵션은 false입니다. 이는 다른 클래스의 확장이 아니라 기본에서 상속되는 새 클래스임을 나타냅니다. 기본값은 false이므로 클래스가 확장이 아닌 경우 이 특성을 사용할 필요가 없습니다.
전체 예제
다음 코드 예는 클래스 확장을 포함하는 전체 관리 팩을 나타냅니다.
ManagementPack xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" ContentReadable="true" SchemaVersion="1.1">
<Manifest>
<Identity>
<ID>ServiceManager.Extension</ID>
<Version>1.0.0.0</Version>
</Identity>
<Name>ServiceManagerExtension</Name>
<References>
<Reference Alias="System">
<ID>System.Library</ID>
<Version>1.0.2780.0</Version>
<PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
</Reference>
<Reference Alias="Incident">
<ID>System.WorkItem.Incident.Library</ID>
<Version>1.0.2780.0</Version>
<PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
</Reference>
</References>
</Manifest>
<TypeDefinitions>
<EntityTypes>
<ClassTypes>
<ClassType ID="IncidentManagmentPack.Extension" Accessibility="Public" Base="Incident!System.WorkItem.Incident" Hosted="false" Extension="true">
<Property ID="TimeOnIncident" Type="int" Key="false" />
</ClassType>
</ClassTypes>
</EntityTypes>
</TypeDefinitions>
</ManagementPack>
cmdlet을 사용하여 관리 팩 가져오기
Windows PowerShell Import-SCSMManagementPack cmdlet을 사용하여 Service Manager 관리 팩을 가져올 수 있습니다. 예를 들면 다음과 같습니다.
Import-SCSMManagementPack MyServiceManager.ManagementPack.xml
이 문서에서는 Service Manager 콘솔에서 관리 팩을 가져오고 사용하는 방법을 설명하지 않습니다. Service Manager 콘솔에서 관리 팩을 사용하는 방법에 대한 자세한 내용은 Service Manager에서 관리 팩 사용을 참조하세요.
전체 관리 팩 예제
다음 코드 예제에서는 양식 정의 및 양식에 대한 C# 코드 숨김 외에도 이 문서의 예제에 사용되는 전체 샘플 관리 팩을 나타냅니다.
관리 팩
<ManagementPack ContentReadable="true" SchemaVersion="1.1" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<Manifest>
<Identity>
<ID>ServiceManager.Projector</ID>
<Version>7.0.3707.0</Version>
</Identity>
<Name>Projector Library</Name>
<References>
<Reference Alias="SMConsole">
<ID>Microsoft.EnterpriseManagement.ServiceManager.UI.Console</ID>
<Version>7.0.3707.0</Version>
<PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
</Reference>
<Reference Alias="Authoring">
<ID>Microsoft.EnterpriseManagement.ServiceManager.UI.Authoring</ID>
<Version>7.0.3707.0</Version>
<PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
</Reference>
<Reference Alias="System">
<ID>System.Library</ID>
<Version>7.0.3707.0</Version>
<PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
</Reference>
<Reference Alias="SMConfig">
<ID>ServiceManager.ConfigurationManagement.Library</ID>
<Version>7.0.3707.0</Version>
<PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
</Reference>
</References>
</Manifest>
<TypeDefinitions>
<EntityTypes>
<ClassTypes>
<ClassType ID="System.ConfigItem.Projector" Accessibility="Public" Abstract="false" Base="System!System.ConfigItem" Hosted="false" Singleton="false" Extension="false">
<Property ID="SerialNumber" Type="int" Key="true" />
<Property ID="Make" Type="string" />
<Property ID="Model" Type="string" />
<Property ID="Location" Type="string" />
<Property ID="Condition" Type="enum" EnumType="ProjectorCondition" />
</ClassType>
</ClassTypes>
<EnumerationTypes>
<EnumerationValue ID="ProjectorCondition" Accessibility="Public" />
<EnumerationValue ID="ProjectorCondition.Working" Accessibility="Public" Parent="ProjectorCondition" />
<EnumerationValue ID="ProjectorCondition.BeingRepaired" Accessibility="Public" Parent="ProjectorCondition" />
<EnumerationValue ID="ProjectorCondition.New" Accessibility="Public" Parent="ProjectorCondition" />
<EnumerationValue ID="ProjectorCondition.Broken" Accessibility="Public" Parent="ProjectorCondition" />
<EnumerationValue ID="ProjectorViewTasksEnumeration" Accessibility="Public" />
</EnumerationTypes>
</EntityTypes>
</TypeDefinitions>
<Categories>
<Category ID="AllProjectorsView.Category" Target="AllProjectorsView" Value="SMConsole!Microsoft.EnterpriseManagement.ServiceManager.UI.Console.ViewTasks" />
<Category ID="ProjectorViewHasTasks.CreateTask" Target="AllProjectorsView" Value="Authoring!Microsoft.EnterpriseManagement.ServiceManager.UI.Authoring.CreateTypeCategory" />
<Category ID="Projector.ProjectorConditionCategory" Target="ProjectorCondition" Value="Authoring!Microsoft.EnterpriseManagement.ServiceManager.UI.Authoring.EnumerationViewTasks" />
<Category ID="Project.ProjectorConditionEnumVisibleCategory" Target="ProjectorCondition" Value="System!VisibleToUser" />
</Categories>
<Presentation>
<Forms>
<Form ID="TestForm" Accessibility="Public" Target="System.ConfigItem.Projector" Assembly="ProjectorFormsAssembly" TypeName="New_CI_lab.TestControl">
<Category>Form</Category>
</Form>
</Forms>
<Views>
<View ID="AllProjectorsView" Accessibility="Public" Enabled="true" Target="System.ConfigItem.Projector" TypeID="SMConsole!GridViewType" Visible="true">
<Category>NotUsed</Category>
<Data>
<Adapters>
<Adapter AdapterName="dataportal:EnterpriseManagementObjectAdapter">
<AdapterAssembly>Microsoft.EnterpriseManagement.UI.SdkDataAccess</AdapterAssembly>
<AdapterType>Microsoft.EnterpriseManagement.UI.SdkDataAccess.DataAdapters.EnterpriseManagementObjectAdapter</AdapterType>
</Adapter>
<Adapter AdapterName="viewframework://adapters/AdvancedList">
<AdapterAssembly>Microsoft.EnterpriseManagement.UI.ViewFramework</AdapterAssembly>
<AdapterType>Microsoft.EnterpriseManagement.UI.ViewFramework.AdvancedListSupportAdapter</AdapterType>
</Adapter>
<Adapter AdapterName="omsdk://Adapters/Criteria">
<AdapterAssembly>Microsoft.EnterpriseManagement.UI.SdkDataAccess</AdapterAssembly>
<AdapterType>Microsoft.EnterpriseManagement.UI.SdkDataAccess.DataAdapters.SdkCriteriaAdapter</AdapterType>
</Adapter>
</Adapters>
<ItemsSource>
<AdvancedListSupportClass DataTypeName="" AdapterName="viewframework://adapters/AdvancedList" FullUpdateAdapter="dataportal:EnterpriseManagementObjectAdapter" FullUpdateFrequency='1' DataSource="mom:ManagementGroup"
IsRecurring="true" RecurrenceFrequency="5000" Streaming='true' xmlns="clr-namespace:Microsoft.EnterpriseManagement.UI.ViewFramework;assembly=Microsoft.EnterpriseManagement.UI.ViewFramework" xmlns:av="https://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" >
<AdvancedListSupportClass.Parameters>
<QueryParameter Parameter="TargetClass" Value="System.ConfigItem.Projector"/>
</AdvancedListSupportClass.Parameters>
</AdvancedListSupportClass>
</ItemsSource>
<Criteria />
</Data>
<Presentation>
<Columns>
<mux:ColumnCollection xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:mux="https://schemas.microsoft.com/SystemCenter/Common/UI/Views/GridView" xmlns:s="clr-namespace:System;assembly=mscorlib">
<mux:Column Name="SerialNumber" DisplayMemberBinding="{Binding Path=SerialNumber}" Width="100" DisplayName="SerialNumber" Property="SerialNumber" DataType="s:Int32" />
<mux:Column Name="Location" DisplayMemberBinding="{Binding Path=Location}" Width="100" DisplayName="Location" Property="Location" DataType="s:String" />
<mux:Column Name="Condition" DisplayMemberBinding="{Binding Path=Condition.DisplayName}" Width="100" DisplayName="Condition" Property="Condition.DisplayName" DataType="s:String" />
<mux:Column Name="DisplayName" DisplayMemberBinding="{Binding Path=DisplayName}" Width="100" DisplayName="Display Name" Property="DisplayName" DataType="s:String" />
<mux:Column Name="OwnerUser" DisplayMemberBinding="{Binding Path=OwnerUser.DisplayName}" Width="100" DisplayName="SupportOwner" Property="OwnerUser.DisplayName" DataType="s:String" />
</mux:ColumnCollection>
</Columns>
</Presentation>
</View>
</Views>
<Folders>
<Folder ID="Folder.Projectors" Accessibility="Public" ParentFolder="SMConfig!ServiceManager.Console.ConfigurationManagement.ConfigItem.Root" />
</Folders>
<FolderItems>
<FolderItem ElementID="AllProjectorsView" ID="FolderItem.AllProjectors" Folder="Folder.Projectors" />
</FolderItems>
<ImageReferences>
<ImageReference ElementID="Folder.Projectors" ImageID="SMConfig!ConfigItemImage16x16" />
<ImageReference ElementID="AllProjectorsView" ImageID="SMConfig!ConfigItemImage16x16" />
</ImageReferences>
</Presentation>
<LanguagePacks>
<LanguagePack ID="ENU" IsDefault="true">
<DisplayStrings>
<DisplayString ElementID="System.ConfigItem.Projector">
<Name>Projector</Name>
</DisplayString>
<DisplayString ElementID="Folder.Projectors">
<Name>Projectors</Name>
<Description>This is the Projector Folder</Description>
</DisplayString>
<DisplayString ElementID="AllProjectorsView">
<Name>All Projectors</Name>
<Description>This displays all projectors</Description>
</DisplayString>
<DisplayString ElementID="ProjectorCondition.Working">
<Name>Working</Name>
</DisplayString>
<DisplayString ElementID="ProjectorCondition.Broken">
<Name>Broken</Name>
</DisplayString>
<DisplayString ElementID="ProjectorCondition.BeingRepaired">
<Name>In Repair</Name>
</DisplayString>
<DisplayString ElementID="ProjectorCondition.New">
<Name>New</Name>
</DisplayString>
</DisplayStrings>
</LanguagePack>
</LanguagePacks>
<Resources>
<Assembly ID="ProjectorFormsAssembly" Accessibility="Public" FileName="New_CI_lab.dll" QualifiedName="New_CI_lab, Version=0.0.0.0" />
</Resources>
</ManagementPack>
양식 정의
<UserControl
xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:SMFormsDemo"
x:Class="SMFormsDemo.TestControl"
x:Name="Control"
Width="574" Height="390" Opacity="1" xmlns:d="https://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" Background="{DynamicResource {x:Static SystemColors.WindowBrushKey}}">
<UserControl.Resources>
<ObjectDataProvider ObjectType="{x:Type local:helper}" MethodName="GetStatusValues" x:Key="getStatusValues" />
</UserControl.Resources>
<Grid x:Name="LayoutRoot">
<Label Margin="70,20,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" Content="Serial Number:"/>
<TextBox Margin="180,20,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" d:IsStaticText="True" Text="{Binding Path=SerialNumber, Mode=TwoWay}"/>
<Label Margin="70,60,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" Content="Make:"/>
<TextBox Margin="180,60,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" d:IsStaticText="True" Text="{Binding Path=Make, Mode=TwoWay}" />
<Label Margin="70,100,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" Content="Model:"/>
<TextBox Margin="180,100,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" d:IsStaticText="True" Text="{Binding Path=Model, Mode=TwoWay}"/>
<Label Margin="70,140,80,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" Content="Location:"/>
<TextBox Margin="180,140,80,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" d:IsStaticText="True" Text="{Binding Path=Location, Mode=TwoWay}" />
<Label Margin="70,180,80,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" Content="Condition:"/>
<ComboBox Margin="180,180,80,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" ItemsSource="{Binding Source={StaticResource getStatusValues}, Mode=OneWay }" IsSynchronizedWithCurrentItem="True">
<ComboBox.SelectedItem>
<Binding Path="Condition" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged"/>
</ComboBox.SelectedItem>
<ComboBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding Path=DisplayName}"/>
</StackPanel>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
</Grid>
</UserControl>
양식 코드 숨김
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Threading;
using System.Windows.Controls;
using Microsoft.EnterpriseManagement.ServiceManager.Application.Common;
using Microsoft.EnterpriseManagement.UI.DataModel;
namespace SMFormsDemo
{
/// <summary>
/// Interaction logic for ProjectorForm.xaml
/// </summary>
public partial class TestControl : UserControl
{
public TestControl()
{
InitializeComponent();
}
}
public class helper
{
public static ICollection<IDataItem> GetStatusValues()
{
return ConsoleContextHelper.Instance.GetEnumerations("ProjectorCondition",true);
}
}
}