C# 코드에서 wpf의 ResourceDictionary에 액세스하려면 어떻게 해야 합니까?
나는 있습니다DataTemplate
C# 코드를 통해 액세스하려는 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는 프로젝트의 기본 디렉터리를 기준으로 생성한 위치에 따라 리소스 사전으로 수정해야 합니다.
여기서 답을 찾았습니다.
- 리소스 사전 "ColorResources.xaml"을 생성합니다.
추가: 파란색
app.xml을 편집하고 다음을 추가합니다.
코드의 색상을 사용합니다.
var color = (시스템).창문들.매체.색상)어플.현재의.리소스 찾기("버튼 색상1");
그리고 voila
ps: 관리자가 코드를 고칠 수 있습니까?그것은 나타나지 않습니다, 감사합니다.
위의 방법 중 하나를 사용하면 위치를 기반으로 리소스를 얻을 수 있습니다. MVVMM을 따르는 경우 다음과 같은 방법을 사용하는 것이 좋습니다.
- ProvideDataTemplateService와 같은 서비스를 만듭니다(동작에서 일반적으로 상속되는 서비스를 만듭니다).
- 원하는 컨테이너를 사용하여 데이터 템플에 액세스할 수 있는 이 서비스를 주입합니다.
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
'prosource' 카테고리의 다른 글
날짜/시간 문자열을 다른 날짜 문자열로 변환하려면 어떻게 해야 합니까? (0) | 2023.05.03 |
---|---|
WPF 날짜 선택기의 문자열 형식 변경 (0) | 2023.04.28 |
Swift 컴파일러 오류: "프레임워크 모듈 내부의 비모듈형 헤더" (0) | 2023.04.28 |
Android:context.getDrawable()에 대한 대안 (0) | 2023.04.28 |
Java 8: 새 줄과 들여쓰기로 람다 서식 지정 (0) | 2023.04.28 |