app.xaml에서 기본 WPF 창 스타일을 설정하는 방법
WPF Windows 어플리케이션의 모든 창에 대해 기본 스타일을 설정하려고 합니다.aml로 설정하려고 합니다.지금까지 app.xaml:
<Application.Resources>
<ResourceDictionary>
<Style x:Key="WindowStyle" TargetType="{x:Type Window}">
<Setter Property="Background" Value="Blue" />
</Style>
</ResourceDictionary>
</Application.Resources>
앱 실행 시(VS 디자이너에서는 아님)에 이 스타일을 사용하도록 특별히 지시하면 다음과 같은 방법으로 창이 이 스타일로 나타나게 할 수 있습니다.
Style="{DynamicResource WindowStyle}
이것은 작동하지만 이상적이지는 않습니다.그럼 어떻게 해야 하나요?
- 모든 창에서 자동으로 스타일을 사용하도록 설정합니까(모든 창에서 스타일을 지정할 필요가 없음)?
- VS 디자이너가 스타일을 보여주나요?
감사합니다!
Ray의 말에 덧붙이자면:
스타일의 경우 키/ID를 제공하거나 대상 유형을 지정해야 합니다.
이 지정되어 않은 FrameworkElement는 항상 을 keyFrameworkElement로하여 스타일리소스를
WPF - WPF(WPF, Griffith)
TargetType을 지정하면 해당 유형의 모든 인스턴스에 스타일이 적용됩니다.★★★★★★★★★★...그런 것 같아요. <Style TargetType="{x:Type Window}">
모든 커스텀 파생상품/윈도우에서는 동작하지 않습니다. <Style TargetType="{x:Type local:MyWindow}">
마이 윈도 때문에 는 '먹다' 입니다.
- 스타일을 적용할 모든 창의 스타일 특성으로 지정하는 키 지정 스타일을 사용합니다.디자이너가 스타일링한 창을 보여줄 것이다.
.
<Application.Resources>
<Style x:Key="MyWindowStyle">
<Setter Property="Control.Background" Value="PaleGreen"/>
<Setter Property="Window.Title" Value="Styled Window"/>
</Style>
</Application.Resources> ...
<Window x:Class="MyNS.MyWindow" Style="{StaticResource MyWindowStyleKey}"> ...
- 또는 Ctor/Initialization/Load 단계에서 Style 속성을 한 번 설정하는 커스텀 BaseWindow 클래스(자체 퀴크가 있음)에서 파생할 수도 있습니다.그러면 모든 파생상품에 해당 스타일이 자동으로 적용됩니다.하지만 디자이너가 당신의 스타일을 알아채지 못할 것입니다. 당신은 당신의 앱을 실행해야만 그 스타일이 적용되는 것을 볼 수 있습니다.디자이너는 Initialize Component(자동/디자이너 생성 코드)만 실행하고 있기 때문에 XAML은 적용되지만 커스텀 코드 배후에 적용되지 않습니다.
그래서 나는 명시적으로 지정된 스타일이 가장 덜 힘든 작업이라고 말하고 싶다.어쨌든 스타일의 측면을 중앙에서 변경할 수 있습니다.
몇 년 뒤라는 걸 알지만 문제는 아직 남아있어
프로젝트에 리소스 사전 만들기(프로젝트 오른쪽 클릭...)
프로젝트 아래에 "자산"이라는 새 폴더를 만들고 "리소스 딕트"를 넣습니다.XAML이 들어있어요.
resourceDict에 코드를 추가합니다.XAML:
<Style x:Key="WindowStyle" Target Type="Window" > <Setter Property="Background" Value="Blue" /> </Style>
프로젝트 XAML 파일의 창 아래에 다음을 추가합니다.
<Window.Resources> <ResourceDictionary> <!-- Believe it or not the next line fixes a bug MS acknowledges --> <Style TargetType="{x:Type Rectangle}" /> <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="/Assets/resourceDict.XAML" /> </ResourceDictionary.MergedDictionaries> <ResourceDictionary> </Window.Resources>
다음 웹 사이트를 참조하십시오.병합된 사전을 포함하는 리소스 사전을 참조하는 데 문제가 있습니다. " 버그가 있습니다. 모든 기본 스타일이 병합된 사전에 3단계 깊이(또는 깊이) 중첩되어 있으면 상위 사전에 플래그가 표시되지 않으므로 검색이 건너뜁니다.이 문제를 해결하려면 루트 사전에서 기본 스타일을 무언가에 추가하는 것입니다."그리고 그것은 상황을 안정적으로 고치는 것처럼 보인다.생각해 봐...
마지막으로 Window에서 제목 다음이나 마지막 창 '>' 앞일 수 있습니다.
Style="{DynamicResource windowStyle}"
또한 스타일을 적용하는 모든 프로젝트에 스텝3과 4의 코드를 추가해야 합니다.
단색이 아닌 그라데이션 배경을 사용하려면 resourceDict에 다음 코드를 추가합니다.XAML:
<LinearGradientBrush x:Key="windowGradientBackground" StartPoint="0,0" EndPoint="0,1" > <GradientStop Color= "AliceBlue" Offset="0" /> <GradientStop Color= "Blue" Offset=".75" /> </LinearGradientBrush>
또한 스타일 세터를 배경색으로 수정하여 다음을 읽습니다.
<Setter Property="Background" Value="{DynamicResource windowGradientBackground}" />
각 프로젝트에서 순서 3과 4를 반복해야 합니다.XAML 파일은 위에서 설명한 바와 같습니다만, 솔루션 전체에서 통일된 Windows를 사용할 수 있습니다.버튼 등 통일된 외관을 원하는 모든 컨트롤에도 동일한 프로세스를 적용할 수 있습니다.
이렇게 늦게 들어오는 사람들은 이것이 도움이 되기를 바랍니다. 나는 원본 포스터가 수년 전에 이 모든 것을 이해했다고 확신하기 때문입니다.
폴.
DynamicResource를 지정하기 때문에 디자이너가 작동하지 않습니다.Static Resource로 변경하시면 모든 것이 정상입니다.
모든 창에 적용하려면 스타일에서 x:키를 제거해야 합니다.TargetType을 설정하면 x:Key가 TargetType에 있는 모든 것으로 암묵적으로 설정됩니다.다만, 제 테스트에서는, 이것이 동작하지 않기 때문에, 조사하고 있습니다.
TargetType을 x:Type TextBlock으로 설정하면 디자이너가 완벽하게 작동하지만 Window가 다른 동작을 보이는 것 같습니다.
App.xaml.cs 파일에 다음 코드를 추가할 수 있습니다.
FrameworkElement.StyleProperty.OverrideMetadata(typeof(Window), new FrameworkPropertyMetadata
{
DefaultValue = Application.Current.FindResource(typeof(Window))
});
후, 그, 타에 Window
에서 파생된 됩니다.Window
저는 며칠 동안 이것을 조사하여 커스텀 윈도 클래스의 컨스트럭터를 통해 작동하게 했습니다.
public class KWindow : Window
{
public KWindow()
{
this.SetResourceReference(StyleProperty, typeof(KWindow));
}
static KWindow()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(KWindow), new FrameworkPropertyMetadata(typeof(KWindow)));
}
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
// gets called finally
}
}
도움이 되었으면 좋겠다
이 문제에 대한 해결책으로 어려움을 겪고 있는 고객:모든 Window 파생 유형에 사용자 지정 스타일을 자동으로 적용하려면 어떻게 해야 합니까?다음은 제가 생각해낸 해결책입니다.
메모: Window 타입에서 파생하고 싶지 않거나 프로젝트 고유의 이유로 XAML을 각 창에 삽입하여 스타일 업데이트를 강요할 필요가 없었습니다(제품의 소비자는 일반적인 재사용 가능한 스타일 라이브러리를 사용하여 독자적인 레이아웃/윈도우를 작성하는 등).그래서 저는 어떤 부작용도 감수하고 살 수 있는 해결책을 찾고 싶었습니다.
인스턴스화된 모든 창을 반복하고 창 유형에 대해 정의한 새 사용자 정의 스타일을 사용하도록 강제해야 합니다.이는 이미 실행 중인 윈도우에 매우 효과적이지만 윈도우 또는 자녀 윈도우가 인스턴스화되면 기본 타입으로 선언된 새로운/커스텀 타입(바닐라 윈도우 타입)을 사용할 수 없습니다.그래서 생각할 수 있는 최선의 방법은 메인창에서 LostKeyBoardFocus를 사용하여 ChildWindow에 Focus를 잃었을 때(자녀창이 만들어졌을 때 IOW) 이 FixupWinderedTypes()를 호출하는 것입니다.
만약 어떤 종류의 윈도우 파생 타입이 인스턴스화 되었을 때 "검출"하기 위한 더 나은 솔루션을 가지고 있다면 Fixup Window Derived Types()를 호출하는 것이 좋습니다.이 영역에서도 WM_WINDOW POSCHANGING을 처리할 때 도움이 될 수 있습니다.
따라서 이 솔루션은 말 그대로 우아하지는 않지만 윈도우와 관련된 코드나 XAML을 터치하지 않고도 작업을 수행할 수 있습니다.
public static void FixupWindowDerivedTypes()
{
foreach (Window window in Application.Current.Windows)
{
//May look strange but kindly inform each of your window derived types to actually use the default style for the window type
window.SetResourceReference(FrameworkElement.StyleProperty, DefaultStyleKeyRetriever.GetDefaultStyleKey(window));
}
}
}
}
//Great little post here from Jafa to retrieve a protected property like DefaultStyleKey without using reflection.
http://themechanicalbride.blogspot.com/2008/11/protected-dependency-properties-are-not.html
//Helper class to retrieve a protected property so we can set it
internal class DefaultStyleKeyRetriever : Control
{
/// <summary>
/// This method retrieves the default style key of a control.
/// </summary>
/// <param name="control">The control to retrieve the default style key
/// from.</param>
/// <returns>The default style key of the control.</returns>
public static object GetDefaultStyleKey(Control control)
{
return control.GetValue(Control.DefaultStyleKeyProperty);
}
}
기슈의 대답을 생각해 보니 또 하나의 회피책이 생각났다.하지만 조금 이상할 수도 있어요.MVVM 패턴을 사용하는 경우 XAML 파일에서 창 뒤의 코드와 x:Class 마크업을 제거할 수 있습니다.따라서 창 또는 커스텀창 인스턴스는 얻을 수 있지만 '윈도' 클래스에서 파생되어 부분적인 것으로 표시된 'MainWindow' 클래스의 인스턴스는 얻을 수 없습니다.VS와 같은 창을 만들고 있기 때문에 윈도 클래스를 상속받아 기능을 확장해야 했습니다.이 경우 새로운 윈도 클래스를 상속 없이 코드 배후에 만들 수 있는 부분적인 것으로 만들 수 있습니다.
모든 스타일을 하나의 xaml 파일에 저장합니다(xaml design.xaml).
이 모든 페이지에서 (design.xaml) xaml 파일을 호출합니다.
예를 들어 다음과 같습니다.
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Design.xaml"/>
</ResourceDictionary.MergedDictionaries>
언급URL : https://stackoverflow.com/questions/431940/how-to-set-default-wpf-window-style-in-app-xaml
'programing' 카테고리의 다른 글
Postgres 배열에 값이 있는지 확인합니다. (0) | 2023.04.13 |
---|---|
체크아웃을 사용하지 않고 Git 브랜치 병합, 업데이트 및 풀 (0) | 2023.04.13 |
$(명령어)라는 명령어를 달러 기호와 괄호 안에 넣는 것은 셸에서 무엇을 의미합니까? (0) | 2023.04.13 |
Interface Builder로 작성된 nib 파일을 사용하여 UIView를 로드하는 방법 (0) | 2023.04.13 |
인라인 기능을 사용할 때와 사용하지 않을 때? (0) | 2023.04.13 |