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

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



답변

당신이 묻는 것은 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>


답변

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

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

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

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


답변

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

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

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

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


답변

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


답변