문제

WPF를 지원하는 C# (2008/.NET 3.5) 클래스 라이브러리 어셈블리가 있습니다 ( 이 기사).
나는 여러 창을 만들었고 이제는 공통 스타일 세트를 만들려고 노력하고 있습니다. 그러나 클래스 라이브러리 (WPF 앱 대신)이므로 글로벌 액세스를 위해 이러한 스타일을 저장할 app.xaml (및 해당 응용 프로그램 및 해당 응용 프로그램)이 없습니다.

그래서: 어셈블리의 모든 XAML 파일에서 볼 수있는 최상위 스타일 정의 세트를 어떻게 만들 수 있습니까? app.xaml이 없다는 것을 감안할 때 (위 참조)? 및/또는 가능합니까? 추가하다 클래스 라이브러리에 작동하는 app.xaml?

참고로, 나는 Resourcedictionary.xaml 파일에서 Resourcedictionary를 만들고 "Window.Resources"블록 내에 각 창에 포함시켰다. 그것은 버튼의 스타일링 등을 해결하는 것으로 판명되었지만 ... 둘러싸는 창은 아닙니다. 나는 넣을 수있다 Style="{StaticResource MyWindowStyle}" 창의 오프닝 블록에서 VS 디자인 창에서 컴파일하고 표시되지만 실제 런타임에는 구문 분석 예외가 발생합니다 (MyWindowStyle은 찾을 수 없습니다. Visual Studio가 문제의 라인 후에 포함 된 사전을 볼 수 있습니다. 그러나 CRL은 더 순차적으로 일을하므로 아직 자원을 적재하지 않았습니다).


아이디어에 감사하지만 여전히 갈 수 없습니다 ... 분명히 클래스 라이브러리는 generic.xaml 사용을 암시 적으로 지원하지 않습니다. Class Library 프로젝트에 generic.xaml을 추가하고 빌드 조치를 "자원"으로 설정했습니다. 그것은 포함한다 :

<ResourceDictionary 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Style TargetType="{x:Type Window}" x:Key="MyWindow">
        <Setter Property="Background" Value="Black"/>
    </Style>
</ResourceDictionary>

테마를 사용하고 싶은 창 XAML은 다음과 같습니다.

<Window x:Class="MyAssembly.ConfigureGenericButtons"
    x:ClassModifier="internal"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Style="{StaticResource MyWindow}"
    Title="ConfigureGenericButtons">
...Buttons, etc...
</Window>

VS 디자인 창은 MyWindow 스타일 (예 : 검은 색 배경)을 사용하여 창을 표시하지 않지만 잘 컴파일하고 시작합니다. 그러나이 클래스 라이브러리가 포함 된 앱 이이 창을 표시하게하는 호출을 할 때 xamlparseexception을 얻습니다.

'{mywindow}'라는 자원을 찾을 수 없습니다.

또한 창이 기본적으로 스타일을 사용하는지 확인하기 위해 스타일 매개 변수를 제외하려고 시도했습니다 (x : key in generic.xaml 포함 및없이 둘 다 시도했습니다). 오류는 없지만 generic.xaml에 정의 된 내용도 표시되지 않았습니다.

내가 여기서 뭔가 잘못하고 있습니까, 아니면 창에서 일반적인 커스텀 스타일을 어떻게 사용할 수 있는지에 대한 다른 아이디어 (즉, 각 창의 xaml에서 스타일을 정의 할 필요가 없음) - 이것은 신청?

도움이 되었습니까?

해결책

추가 해보세요

Style={DynamicResource MyStyle}

이 경우 staticResource를 사용할 수 없습니다.

다른 팁

이것은 테마의 직업처럼 들립니다.

  1. 을 추가하다 /themes/generic.xaml 프로젝트에 대한 자원.
  2. AssemblyInfo.cs에 다음을 추가하십시오. [assembly: ThemeInfo(ResourceDictionaryLocation.None, ResourceDictionaryLocation.SourceAssembly)]
  3. ?
  4. 이익!

Generic에 추가 한 모든 리소스는 모든 컨트롤에서 사용됩니다. 또한 귀하는 프로필 특정 테마 (Luna, Aero 등)를 themes 예배 규칙서.

그녀는 추가 정보에 대한 링크입니다. 사용자 정의 테마를 만들고 적용하십시오

App.xaml이없는 경우에도 Application 레벨 리소스에로드 할 수 있지만 이와 유사하게 코드 (XAML 아님)를 작성해야합니다 ...

void LoadIt()
{
     ResourceDictionary MyResourceDictionary = new ResourceDictionary();
     MyResourceDictionary.Source = new Uri("MyResources.xaml", UriKind.Relative);
     App.Current.Resources.MergedDictionaries.Add(  MyResourceDictionary )
}

예를 들어이 사이트를 확인하십시오.http://ascendedguard.com/2007/08/one-of-nice-features-about-wpf-is-how.html

WPF 박사 (또는 이전에 WPF로 알려진 사람)는 훌륭합니다. 게시하다 주제에.

다음은 응용 프로그램 객체를 생성하고 리소스를 추가하는 게시물에서 발췌 한 내용입니다.

if (Application.Current == null)
{
    // create the Application object
    new Application();

    // merge in your application resources
    Application.Current.Resources.MergedDictionaries.Add(
        Application.LoadComponent(
            new Uri("MyLibrary;component/Resources/MyResourceDictionary.xaml",
            UriKind.Relative)) as ResourceDictionary);
}

내 어셈블리가 Interop을 통해 호스팅되기 때문에 다음과 같이 ShutdownMode를 설정하고 완료되면 종료를 추가해야했습니다.

new Application() { ShutdownMode = ShutdownMode.OnExplicitShutdown };

그것은 매력처럼 작동했습니다.

Window.Resource에로드하면 사전은 해당 창의 어린이에게만 사용할 수 있습니다. 창문과 아이들에게 사용할 수 있어야합니다.

app.xaml 파일에로드하십시오. 이를 통해 윈도우 레벨 리소스가 아닌 애플리케이션 레벨 리소스로 만들어야합니다.

그래서 많은 시간을 보낸 후 나는 마침내 이것을 알아 냈습니다. 방법은 다음과 같습니다.

  1. WPF Controls 라이브러리에서 이름이 지정된 새 폴더 추가 themes.
  2. 내부 themes 폴더, 이름이 지정된 리소스 사전을 추가하십시오 generic.xaml.
  3. 내부에 generic.xaml, 다음 구문을 사용하여 자원을 추가하십시오.

    <SolidColorBrush x:Key="{ComponentResourceKey {x:Type local:UserControl1}, MyEllipseBrush}" Color="Blue" />
    
  4. 제어에서 다음 구문을 사용 하여이 리소스에 액세스하십시오.

    Background="{StaticResource {ComponentResourceKey {x:Type local:UserControl1}, MyEllipseBrush}}"
    

주목할만한 것 :

  1. 1 단계와 2는 새로운 WPF 컨트롤 라이브러리를 만들 때 Visual Studio에서 일반적으로 자동으로 수행됩니다.
  2. 나는 목적을 완전히 이해하지 못한다 ComponentResourceKey첫 번째 매개 변수이지만 필요합니다. 이 리소스를 소비 할 컨트롤 이름을 사용하십시오.
  3. Visual Studio의 디자이너는 제 경우에는 리소스를 찾을 수 없었습니다. 캐시 문제 일 수 있습니다. 확실하지 않습니다. 그러나 런타임에는 깔끔하게 작동합니다.
  4. 이 구문에 대한 자세한 내용을 읽을 수 있습니다 이 MSDN 기사.

이것이 삶이 더 쉬워지기를 바랍니다.

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