prosource

C# 코드에서 wpf의 ResourceDictionary에 액세스하려면 어떻게 해야 합니까?

probook 2023. 4. 28. 21:08
반응형

C# 코드에서 wpf의 ResourceDictionary에 액세스하려면 어떻게 해야 합니까?

나는 있습니다DataTemplateC# 코드를 통해 액세스하려는 xaml 파일에 정의되어 있습니다.제가 어떻게 접속하는지 알려주실 수 있나요?새로 추가했습니다.ResourceDictionary파일 이름은 Dictionary1.xaml입니다.다음과 같은 데이터 템플릿이 있습니다.

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <DataTemplate x:Key="mytemplate">
        <TextBlock Text="Name:" Background="Blue"/>
    </DataTemplate>
</ResourceDictionary>

요, 저는 는나가 요.ListBox이라는 이름을 .Itemtemplate재산인데 어떻게 해야 하나요?

때부터Application.Current제 경우에는 무효였고, 결국 이것을 사용하게 되었습니다.

    var myResourceDictionary = new ResourceDictionary();
    myResourceDictionary.Source =
        new Uri("/DllName;component/Resources/MyResourceDictionary.xaml",
                UriKind.RelativeOrAbsolute);  

그런 다음 사용하여 필요한 특정 키를 얻습니다.myResourceDictionary["KeyName"] as TypeOfItem

(소스)

정확히 어디에 정의를 내리시는 겁니까?

개체의 ResourceDictionary에서 정의한 경우

Application.Current.Resources[typeof(yourDataTemplateTargetType)] 

작동해야 합니다.ItemsControl과 같은 다른 구성원으로 정의하는 경우 ItemsControl 인스턴스에 대한 핸들을 가져와 ItemTemplate 속성을 호출해야 합니다.

편집: 좋아요, 뭔가 진전이 있는 것 같아요.따라서 리소스 사전을 자체 파일에 정의하는 것입니다.UI에서 사용하고 뒤에 있는 코드에서 액세스하려면 먼저 해당 리소스 사전을 응용 프로그램에 병합해야 합니다.당신 이 일을 할 건가요?

그렇다면 다음 단계는 이 리소스를 가져오는 것입니다.각 FrameworkElement에는 FindResource라는 메서드가 있습니다.이 방법은 ResourceDictionary 트리를 위로 이동하고 키를 사용하여 리소스를 찾으려 하기 때문에 유용합니다.따라서 사용자 컨트롤에서 이 리소스에 액세스하려는 경우 뒤에 있는 코드에서 다음을 수행할 수 있습니다.

FindResource(typeof(yourDataTemplateTargetType));

이 방법이 사용자에게 적용되지 않는 경우 이 리소스 사전을 선언하는 방법과 응용 프로그램의 리소스에 병합하는 방법을 정확하게 보여 주십시오.

예를 들어 App.xaml 파일의 리소스 사전에 Button용 템플릿이 있는 경우 다음 코드를 사용하여 액세스할 수 있습니다.

Application.Current.Resources[typeof(Button)]

아래와 같은 코드를 사용하여 리소스 사전을 병합한 경우

<Window x:Class="MainWindow">
    <Window.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="DefaultStyle.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Window.Resources>
</Window>

그런 다음 응용 프로그램 대신 사용합니다.현재의.아래와 같이 컨트롤 이름(이 경우 주 창)을 지정해야 하는 리소스["ResourceKey"]

var style = Application.Current.MainWindow.Resources["ResourceKey"];
// OR
var style = Application.Current.MainWindow.TryFindResource("ResourceKey");

동일한 프로젝트 내에서 리소스를 확보하는 경우 다음을 수행합니다.

yourControl.Style = FindResource("YourResourceKey") as Style;

그렇지 않으면 다음을 시도합니다.

ResourceDictionary res = (ResourceDictionary)Application.LoadComponent(new Uri("/ProjectName;component/FolderName/ResourceDictionaryName.xaml", UriKind.Relative)); 
yourControl.Style = (Style)res["YourResourceKey"];

다음과 같이 프로젝트에 추가한 리소스 사전에 액세스할 수 있습니다.

var rd = new ResourceDictionary();
rd.Source = new Uri("ms-appx:///Dictionary1.xaml");

그런 다음 리소스 사전에 저장된 리소스에 다음과 같이 액세스할 수 있습니다.

someObject.Property = rd["mytemplate"];

예:
URI는 프로젝트의 기본 디렉터리를 기준으로 생성한 위치에 따라 리소스 사전으로 수정해야 합니다.

여기서 답을 찾았습니다.

https://learn.microsoft.com/en-us/dotnet/framework/wpf/advanced/how-to-use-a-resourcedictionary-to-manage-localizable-string-resources

  • 리소스 사전 "ColorResources.xaml"을 생성합니다.
  • 추가: 파란색

  • app.xml을 편집하고 다음을 추가합니다.

  • 코드의 색상을 사용합니다.

    var color = (시스템).창문들.매체.색상)어플.현재의.리소스 찾기("버튼 색상1");

그리고 voila

ps: 관리자가 코드를 고칠 수 있습니까?그것은 나타나지 않습니다, 감사합니다.

위의 방법 중 하나를 사용하면 위치를 기반으로 리소스를 얻을 수 있습니다. MVVMM을 따르는 경우 다음과 같은 방법을 사용하는 것이 좋습니다.

  1. ProvideDataTemplateService와 같은 서비스를 만듭니다(동작에서 일반적으로 상속되는 서비스를 만듭니다).
  2. 원하는 컨테이너를 사용하여 데이터 템플에 액세스할 수 있는 이 서비스를 주입합니다.

XAML을 통해 리소스 사전을 로드할 수는 있었지만 "codebacked"(C#)를 통해 로드할 수는 없었습니다.

그래서 나는 그것을 로드하는 뷰를 갖는 것에 의지했습니다: (MyView.xaml)

  <UserControl.Resources>
    <ResourceDictionary>
      <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="/My.Proj;component/My/Path/myResourceDictionary.xaml" />
      </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
  </UserControl.Resources>

그런 다음 해당 보기를 인스턴스화하고 액세스하여 내 UT에서 액세스합니다.

new MyView().Resources.MergedDictionaries[0]

촌스럽지만 효과가 있습니다.

만약 당신이 보기가 없거나 혹은 당신이 여기에 다른 대답을 덧붙이는 것.Application.Current 흔하지 않을 이라는 것을 , 과 저는이아흔는않것것알라지만을이, ▁an▁▁and▁a,Application.Current 중 에게 null로 . 또한 리소스 중 하나를 부모님께 전달하고 싶습니다.ImageSource리소스를 직접 가져올 수 있는 XAML 보기가 없습니다.

사전을 생성 가능한 개체 뒤의 코드로 만들 수도 있습니다.설정만 하면 됩니다.x:Class후 XAML 파일을 합니다..xaml.cs뒤에 있는 코드에 파일을 넣습니다.XAML은 파일을 XAML, 코파호출다니라고 .MyDictionary.xaml그러면 다음과 같이 보일 것입니다.

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
                    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
                    x:Class="Some.Namespace.MyDictionary"
                    mc:Ignorable="d">
    ...Resources...
</ResourceDictionary>

그리고 뒤에 있는 코드는MyDictionary.xaml.cs는입니다.

using System.Windows;

namespace Some.Namespace
{
    public partial class MyDictionary : ResourceDictionary
    {
        public MyDictionary()
        {
            InitializeComponent();
        }
    }
}

전화하는 것을 잊지 마세요.InitializeComponent()그것이 자원을 적재하는 것이기 때문입니다.죄송합니다. 아래 편집을 참조하십시오.

이 작업을 수행한 후에는 코드의 임의의 위치에 클래스 인스턴스를 구성하고 다음과 같은 키로 리소스를 참조할 수 있습니다.

var dictionary = new MyDictionary();
var resource = dictionary["whateverKey"] as WhateverResourceType;

아이디어를 이끌어 주신 이 게시물에 감사드립니다.

편집

이것과 관련하여 잠재적인 문제 하나에 부딪혔습니다.일부 컨트롤에서 이 설정으로 'ResourceDictionary 인스턴스를 다시 초기화할 수 없음' 예외가 발생했습니다.추가 연구에서 이것은 전화와 관련이 있을 수 있습니다.InitializeComponent생성자에서.대신 코드 뒤에 있는 생성자를 제거하고 정적 메서드를 추가하여 다음과 같이 초기화된 인스턴스를 가져옵니다.

public static MyDictionary ConstructInitializedInstance()
{
    var dictionary = new MyDictionary();
    dictionary.InitializeComponent();
    return dictionary;
}

또한 뒤에 있는 코드를 만들고 초기화할 수도 있습니다.

언급URL : https://stackoverflow.com/questions/618648/how-can-i-access-resourcedictionary-in-wpf-from-c-sharp-code

반응형