134

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


  • 이를 수행하는 올바른 방법은 명령을 사용하는 것입니다. 또한 버튼을 활성화 및 비활성화 할 수있는 기능을 제공하며, 일부 해답이 나에게 해킹의 냄새를 맡길 수있는 방식으로 수행 할 수 있습니다. - Aran Mulholland

4 답변


195

나는 당신이 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>


  • 나이 해석에 대한 답변 추가 정보 : x : Class 특성에 codebehind 클래스의 정규화 된 이름을 지정해야합니다.x:Class="MyCompany.MyProject.MySubFolder1.MyResourceDictionary"그렇지 않으면 x : Class = " MyResourceDictionary " 만 입력하면 xaml 파서가 클래스를 찾지 않습니다. - viggity
  • 부분 클래스 코드 숨김에 기본 생성자를 제공하고 InitializeComponent ()를 호출해야합니다. (필자의 경우 MEF를 사용하여 리소스 사전을 내보냈습니다.) - Scott Whitlock
  • upvoted 코멘트에 대한 코드 스 니펫이 업데이트되었습니다. 나는 대답을 끝내는 것이 필요하다고 느꼈다. 흔한 실수. 나는 그것을 지금했다 :) 만일 당신이 그것을 좋아하지 않으면 되돌아 가라. 답변 해주셔서 감사합니다. - Gishu
  • 적어도 wp8.1에서 이것은 더 이상 유효하지 않으며 resourcedictionary가 참조하는 사용자 정의 usercontrol을 만들어야합니다. - Jared
  • ResourceDictionary의 XAML 파일에 대한 Build Action을 " Page "로 설정해야합니다. 그렇지 않으면 InitializeComponent () 호출이 컴파일되지 않습니다. ResourceDictionary XAML 파일은 기본적으로 " 리소스 "로 설정됩니다. - user1454265

9

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

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

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

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


  • Phobis Dictionary에서 페이지를 분리하는 목적은 Main 페이지 xaml의 재사용 가능성과 가독성에 관한 것입니다. 위의 솔루션은 나를 위해 일했습니다. - cleftheris

5

기슈 (Gishu) - "일반적으로 권장되지 않는 연습"이 아닌 것처럼 보일 수도 있습니다. 다음과 같은 이유 중 하나가 있습니다.

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

기본 사용자 상호 작용 동작을 초기 동작과 다르게하려는 다른 이유는 리소스 사전에있는 코드의 좋은 후보와 같습니다.

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


0

XAML은 코드를 포함하지 않는 개체 그래프를 구성하기위한 것입니다.

데이터 템플릿은 사용자 정의 사용자 객체를 화면에 렌더링하는 방법을 나타내는 데 사용됩니다 (예 : 목록 상자 항목 인 경우). 비헤이비어는 데이터 템플릿의 전문 분야가 아닙니다. 솔루션 다시 그리기 ...


  • 결론 : U 코드 뒤에 리소스 코드를 사용하는 것이 좋을까요 ?? 나는 결코 그것을 사용하지 않았다, 나는 의심하고있다. - Shimmy
  • 그럴 기분이 안 좋습니다. 사전은 특정 키의 값을 반환해야합니다. OP의 경우에는 데이터 템플릿과 코드를 번들링합니다. 다른 방법을 시도해보십시오. 예를 들어 Command 모델을 사용하십시오. diff 솔루션을 추천하기 위해 OP 문제에 대한 자세한 정보가 필요합니다. - Gishu
  • 완전히 동의하지 마라. MVVM을 사용하면 코드 숨김이 매우 유용합니다. 즉 연결된 속성을 개발하는 시나리오가 있습니다. 코드 숨김 작업을 수행 한 다음 연결된 속성으로 이식합니다. 이것은 Manhattan 크기의 뇌가 없다면 첨부 된 속성을 처음부터 개발하는 것보다 훨씬 빠릅니다. - Contango

연결된 질문


관련된 질문

최근 질문