ElementHost에서 호스팅 할 때 동적 응용 프로그램 수준 리소스가 동적이지 않습니다.

StackOverflow https://stackoverflow.com/questions/727141

문제

WinForms 컨테이너에서 WPF USERCONTROL을 호스팅하고 있습니다. 이제 Usercontrol을 테마/스킨을 만들고 싶습니다. 이를 위해 "스킨"을 정의하는 몇 가지 리소스 사전이 있습니다. 내 앱이 시작되면 application.current가 존재하는 "새 system.windows.application ()"을 만듭니다. 테마를 변경하려면 오래된 피부가 제거되고 새로운 스킨이 런타임에 응용 프로그램 수준 리소스 사전으로 병합됩니다. 그러나 이것은 Usercontrol에서 Dyanamically 참조 리소스를 변경하지 않습니다. 나는 이것을 직선 WPF 응용 프로그램에서 시도했고 그것은 잘 작동했습니다. 내가 뭔가를 놓치고 있습니까, 아니면 전혀 할 수 없습니까? 그건 그렇고, UserControl이 초기화되기 전에 응용 프로그램 자원에 피부를 추가하면 작동하지만 그 후에는 피부를 바꿀 수 없습니다.

이것을 가장 기본적인 방법으로 다시 작성하려면 :

새 winforms 응용 프로그램을 만듭니다. 앱에 WPF UserControl을 추가하십시오. 이것은 충분히 간단합니다.

<UserControl ...>
   <Grid>
      <Button
         Background="{DynamicResource ButtonBG}"/>
   </Grid>
</UserControl>

각각의 색상의 주요 버튼bg가있는 solidcolorbrush를 가진 두 개의 Resourcedictionaries, White.xaml 및 black.xaml (또는 무엇이든)를 만듭니다. form1.cs에서 두 개의 버튼과 요소 호스트를 추가하십시오. 요소 호스트의 자녀를 방금 만든 USERCONTROL 인스턴스로 설정하십시오. 피부를 교환하는 이벤트로 버튼을 연결하십시오.

private void White_Click(object sender, EventArgs e)
{
   Application.Current.Resources.MergedDictionaries[0] = 
      (ResourceDictionary)Application.LoadComponent(
         new Uri(@"\WpfThemes;component\White.xaml", UriKind.Relative)));
}

private void Black_Click(object sender, EventArgs e)
{
   Application.Current.Resources.MergedDictionaries[0] = 
      (ResourceDictionary)Application.LoadComponent(
         new Uri(@"\WpfThemes;component\Black.xaml", UriKind.Relative)));
}

program.cs에서 application.curent가 존재하고 초기 피부를 설정하는지 확인하십시오.

[STAThread]
static void Main()
{
   new System.Windows.Application();

   Application.Current.Resources.MergedDictionaries[0] =
      (ResourceDictionary)Application.LoadComponent(
         new Uri(@"\WpfThemes;component\White.xaml", UriKind.Relative)));

   ...
}

이제 흰색 버튼을 클릭하면 USERCONTROL의 버튼이 흰색으로 변하고 검은 색 버튼을 클릭하면 버튼이 검은 색으로 변할 것으로 예상됩니다. 그러나 이것은 일어나지 않습니다.

왜 그런지 아는 사람이 있습니까? 해결책이 있습니까?

편집하다: 아이디어 : 아마도 테마가 변경 될 때 동적 소송의 재평가를 강요하는 방법이 있다면, 그게 작동합니다.

감사합니다, 먼지가 있습니다

도움이 되었습니까?

해결책

나는 이것이 WPF 프레임 워크에서 간과 된 문제 일 수 있다고 생각합니다.

반사판을 통해 알 수있는 것에서는 Application 자원 사전은 치명적으로 변경되었습니다 (피부를 추가, 제거 또는 교체하는 것과 같은 광범위한 효과가있는 변화). Windows 신청서에서 그들을 재평가하도록 강요합니다 DynamicResources. 그러나 내가 고려할 다른 요소 최상위 WPF에서 ElementHosts는 같은 치료를받지 않습니다. 이것은 내가 겪고있는 행동으로 이어집니다.

이 문제에 대한 나의 해결 방법은 ElementHosts 개별적으로 피부를 추가, 제거 또는 교체 ResourceDictionary 파일. 완벽하지는 않지만 작업이 완료됩니다.

다른 팁

또 다른 해결 방법은 더미 창을 만들고 elementhost의 내용을 컨텐츠로 지정하는 것입니다. 응용 프로그램을 살펴보고 자원의 변경 사항을 처리하는 방법을 확인하면 Windows 만 알립니다.

당신이 상기시켜야 할 유일한 것은 창 (-> 예외)을 절대 보여주지 않고 ElementHost를 처리 할 때 닫는 것입니다. 그래서 응용 프로그램이 제대로 종료 될 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top