이벤트 처리를 위해 WPF에서 리소스 사전 뒤에 코드를 설정할 수 있습니까?


147

WPF에서 리소스 사전 뒤에 코드를 설정할 수 있습니까? 예를 들어 버튼의 사용자 컨트롤에서 XAML로 선언합니다. 버튼 클릭에 대한 이벤트 처리 코드는 컨트롤 뒤의 코드 파일에서 수행됩니다. 버튼으로 데이터 템플릿을 만들려면 리소스 사전 내에서 버튼 클릭에 대한 이벤트 처리기 코드를 작성하는 방법은 무엇입니까?


1
이를 수행하는 올바른 방법은 명령을 사용하는 것입니다. 또한 버튼을 활성화 및 비활성화 할 수있는 기능을 제공하지만 일부 답변에서 해킹 냄새가 나도록 제안한 방식을 수행 할 수 있습니다.
Aran Mulholland

답변:


209

당신이 묻는 것은 ResourceDictionary에 대한 코드 숨김 파일을 원한다고 생각합니다. 당신은 완전히 이것을 할 수 있습니다! 사실, 당신은 Window와 같은 방식으로 수행합니다 :

MyResourceDictionary라는 ResourceDictionary가 있다고 가정하십시오. MyResourceDictionary.xaml 파일에서 다음과 같이 x : Class 속성을 루트 요소에 넣으십시오.

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    x:Class="MyCompany.MyProject.MyResourceDictionary"
                    x:ClassModifier="public">

그런 다음 다음 선언을 사용하여 MyResourceDictionary.xaml.cs라는 파일 숨김 코드를 작성하십시오.

namespace MyCompany.MyProject
{
    partial class MyResourceDictionary : ResourceDictionary
    { 
       public MyResourceDictionary()
       {
          InitializeComponent();
       }     
       ... // event handlers ahead..
    }
}

그리고 당신은 끝났습니다. 메서드, 속성 및 이벤트 처리기 등 원하는 코드를 코드 뒤에 넣을 수 있습니다.

== Windows 10 앱용 업데이트 ==

그리고 UWP를 가지고 노는 경우를 대비 하여 알아야 할 것이 하나 더 있습니다.

<Application x:Class="SampleProject.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:rd="using:MyCompany.MyProject">
<!-- no need in x:ClassModifier="public" in the header above -->

    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>

                <!-- This will NOT work -->
                <!-- <ResourceDictionary Source="/MyResourceDictionary.xaml" />-->

                <!-- Create instance of your custom dictionary instead of the above source reference -->
                <rd:MyResourceDictionary />

            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>

</Application>

7
ageektrapped의 답변에 대한 부록 : x : Class 속성에 코드 숨김 클래스의 정규화 된 이름을 입력하십시오. x:Class="MyCompany.MyProject.MySubFolder1.MyResourceDictionary"그렇지 않으면 x : Class = "MyResourceDictionary"만 넣으면 xaml 파서가 클래스를 찾지 못합니다.
viggity

29
부분 클래스 코드 숨김에서 기본 생성자를 제공하고 InitializeComponent ()를 호출하는지 확인하십시오. (제 경우에는 MEF를 사용하여 리소스 사전
Scott Whitlock

4
의견 수렴을 위해 업데이트 된 코드 스 니펫 나는 답을 완성 할 필요가 있다고 느꼈다. 일반적인 실수. 나는 지금 막 그것을했다 :) 당신이 그것을 좋아하지 않으면 되돌리기. 답변 해주셔서 감사합니다.
기후

2
(적어도 wp8.1에서) 이것은 더 이상 유효하지 않으며 리소스 사전이 참조하는 사용자 정의 usercontrol을 작성해야합니다.
Jared

9
ResourceDictionary의 XAML 파일에서 빌드 작업을 "Page"로 설정해야합니다. 그렇지 않으면 InitializeComponent () 호출이 컴파일되지 않습니다. (ResourceDictionary XAML 파일은 일반적으로 기본적으로 "리소스"로 설정되어 있습니다.)
user1454265

9

"ageektrapped"에 동의하지 않습니다. 부분 클래스의 방법을 사용하는 것은 좋은 습관이 아닙니다. 그러면 페이지에서 사전을 분리하는 목적은 무엇입니까?

코드 숨김에서 다음을 사용하여 ax : Name 요소에 액세스 할 수 있습니다.

Button myButton = this.GetTemplateChild("ButtonName") as Button;
if(myButton != null){
   ...
}

사용자 지정 컨트롤을로드 할 때 컨트롤에 연결하려면 OnApplyTemplate 메서드 에서이 작업을 수행 할 수 있습니다 . 이를 위해 OnApplyTemplate을 재정의해야합니다. 이것은 일반적인 관행이며 스타일을 컨트롤에서 분리 된 상태로 유지할 수 있습니다. 스타일은 컨트롤에 의존해서는 안되지만 컨트롤은 스타일에 의존해야합니다.


7
Phobis 필자는 사전을 페이지에서 분리하는 목적이 메인 페이지 xaml의 재사용 성과 가독성에 관한 것이라고 생각합니다. 위의 솔루션도 저에게 효과적이었습니다.
cleftheris 2009

5

Gishu-이것이 "일반적으로 권장되지 않는 연습"인 것처럼 보일 수 있지만 여기에 원하는 이유는 다음과 같습니다.

포커스가있을 때 텍스트 상자의 표준 동작은 컨트롤이 포커스를 잃었을 때와 같은 위치에 캐럿을 배치하는 것입니다. 응용 프로그램 전체에서 사용자가 텍스트 상자의 전체 내용이 강조 표시된 텍스트 상자로 탭 할 때 리소스 사전에 간단한 처리기를 추가하면 트릭을 수행하는 것을 선호합니다.

기본 사용자 상호 작용 동작을 기본 동작과 다르게 설정하려는 다른 이유는 자원 사전에서 코드 숨김의 좋은 후보로 보입니다.

응용 프로그램 기능에 특정한 것은 리소스 사전의 코드 뒤에 있지 않아야한다는 것에 전적으로 동의합니다.


0

XAML은 코드를 포함하지 않는 객체 그래프를 구성하기위한 것입니다.
데이터 템플릿은 사용자 정의 사용자 개체가 화면에 렌더링되는 방법을 나타내는 데 사용됩니다 (예 : 목록 상자 항목 인 경우). 동작은 데이터 템플릿의 전문 영역에 속하지 않습니다. 솔루션을 다시 그리십시오 ...


결론 : 코드 뒤에 자원 dic을 사용하는 것이 좋습니다. 나는 그것을 사용한 적이 없다.
Shimmy Weitzhandler 2016 년

1
나는하지 않을 것입니다-나에게 그것은 기분이 좋지 않습니다. 사전은 특정 키에 대한 값을 반환해야합니다. OP의 경우 데이터 템플릿으로 코드를 묶습니다. 차라리 다른 접근법을 시도하고 싶습니다. 예를 들어 명령 모델을 사용하십시오. diff soln을 추천하려면 OP의 문제에 대한 자세한 내용이 필요합니다.
Gishu

1
완전히 동의하지 않습니다. MVVM을 사용하면 코드 숨김이 매우 유용한 한 가지 시나리오가 있습니다. 첨부 된 속성 개발. 코드 뒤에서 작업 한 다음 연결된 속성으로 이식하십시오. 맨해튼 크기의 뇌가 없다면, 부착 된 속성을 처음부터 새로 개발하는 것보다 훨씬 빠릅니다.
Contango
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.