programing

이벤트 처리를 위해 WPF 자원 딕셔너리 뒤에 코드를 설정할 수 있습니까?

javamemo 2023. 4. 15. 08:12
반응형

이벤트 처리를 위해 WPF 자원 딕셔너리 뒤에 코드를 설정할 수 있습니까?

WPF에서 자원 딕셔너리 뒤에 코드를 설정할 수 있습니까?예를 들어 버튼의 사용자 컨트롤에서 XAML로 선언합니다.버튼 클릭 이벤트 처리 코드는 컨트롤 뒤에 있는 코드 파일에서 실행됩니다.버튼으로 데이터 템플릿을 만들 경우 리소스 사전 내에서 해당 버튼 클릭 이벤트 핸들러 코드를 어떻게 쓸 수 있습니까?

ResourceDictionary의 코드 비하인드 파일을 원하는 것 같습니다.넌 할 수 있어!실제로 창과 동일한 방법으로 수행할 수 있습니다.

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:Name 요소에 액세스할 수 있습니다.

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

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

Gishu - 이것은 "일반적으로 권장되지 않는 관행"으로 보일 수 있지만, 여러분이 그것을 하고 싶은 이유는 다음과 같습니다.

텍스트 상자가 포커스를 얻을 때의 표준 동작은 컨트롤이 포커스를 잃었을 때와 같은 위치에 캐럿을 배치하는 것입니다.사용자가 텍스트 상자의 전체 내용이 강조 표시된 텍스트 상자를 탭할 때 리소스 사전에 단순 핸들러를 추가하면 문제가 해결됩니다.

기본 사용자 상호 작용 동작을 기본 동작과 다르게 하려는 다른 이유는 리소스 사전에서 뒤에 있는 코드를 사용할 수 있는 좋은 후보인 것 같습니다.

애플리케이션 고유의 기능에 대해서는, 자원 사전의 뒤에 있는 코드에 기재되어 있지 않는 것에 전적으로 동의합니다.

추가 중...현재 {x:Bind ...}이(가) 등장함에 따라 DataTemplate를 공유 ResourceDictionary 파일에 삽입하려면 파일 뒤에 코드를 지정해야 합니다.

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

언급URL : https://stackoverflow.com/questions/92100/is-it-possible-to-set-code-behind-a-resource-dictionary-in-wpf-for-event-handlin

반응형