IT story

Windows 7에서도 WPF 응용 프로그램을 메트로 스타일로 보이게합니까?

hot-time 2020. 7. 14. 08:02
반응형

Windows 7에서도 WPF 응용 프로그램을 메트로 스타일로 보이게합니까? (윈도우 크롬 / 테마 / 테마)


새로운 Office Suite 및 Visual Studio에서 창 크롬을 좋아합니다.

여기에 이미지 설명을 입력하십시오

나는 여전히 Windows 7 용 응용 프로그램을 개발하고 있지만이 스타일을 에뮬레이트하는 빠르고 쉬운 방법 (WPF 스타일 또는 Windows 라이브러리)이 있는지 궁금합니다. 나는 과거에 윈도우 크롬 스타일링을 해왔지만, 제대로 보이고 올바르게 작동하는 것은 정말 까다 롭습니다.

"현대 UI"모양과 느낌을 WPF 응용 프로그램에 추가 할 기존 템플릿이나 라이브러리가 있는지 아는 사람이 있습니까?


내가 한 것은 내 자신의 창과 스타일을 만드는 것이 었습니다. 모든 것을 제어하고 외부 라이브러리를 사용하여 Window를 사용하고 싶지 않기 때문에. GitHub 에서 이미 언급 한 MahApps.Metro를 살펴 보았습니다.

MahApps

CodePlex의 매우 멋진 Modern UI 도 있습니다 . (.NET4.5 만 해당)

최신 UI)

엘리시움 이 하나 더 있지만 나는 이것을 시도하지 않았습니다.

엘리시움

내가 한 스타일은 이것에서 어떻게 수행되는지 보았을 때 정말 쉬웠습니다. 이제 나는 내 자신의 Window를 가지고 있으며 xaml로 원하는 것을 할 수 있습니다 ... 내 자신이 한 주된 이유입니다. 그리고 나는 당신을 위해 하나 더 만들었습니다 :) 아마도 현대 UI 를 탐색하지 않고는 그것을 할 수 없을 것이라고 말해야합니다 . 그것은 큰 도움이되었습니다. VS2012 창처럼 보이게하려고했습니다. 이것처럼 보입니다.

MyWindow

코드는 다음과 같습니다 (.NET4.5를 대상으로한다는 점에 유의하십시오)

public class MyWindow : Window
{

    public MyWindow()
    {
        this.CommandBindings.Add(new CommandBinding(SystemCommands.CloseWindowCommand, this.OnCloseWindow));
        this.CommandBindings.Add(new CommandBinding(SystemCommands.MaximizeWindowCommand, this.OnMaximizeWindow, this.OnCanResizeWindow));
        this.CommandBindings.Add(new CommandBinding(SystemCommands.MinimizeWindowCommand, this.OnMinimizeWindow, this.OnCanMinimizeWindow));
        this.CommandBindings.Add(new CommandBinding(SystemCommands.RestoreWindowCommand, this.OnRestoreWindow, this.OnCanResizeWindow));
    }

    private void OnCanResizeWindow(object sender, CanExecuteRoutedEventArgs e)
    {
        e.CanExecute = this.ResizeMode == ResizeMode.CanResize || this.ResizeMode == ResizeMode.CanResizeWithGrip;
    }

    private void OnCanMinimizeWindow(object sender, CanExecuteRoutedEventArgs e)
    {
        e.CanExecute = this.ResizeMode != ResizeMode.NoResize;
    }

    private void OnCloseWindow(object target, ExecutedRoutedEventArgs e)
    {
        SystemCommands.CloseWindow(this);
    }

    private void OnMaximizeWindow(object target, ExecutedRoutedEventArgs e)
    {
        SystemCommands.MaximizeWindow(this);
    }

    private void OnMinimizeWindow(object target, ExecutedRoutedEventArgs e)
    {
        SystemCommands.MinimizeWindow(this);
    }

    private void OnRestoreWindow(object target, ExecutedRoutedEventArgs e)
    {
        SystemCommands.RestoreWindow(this);
    }
}

그리고 여기에 자원 :

<BooleanToVisibilityConverter x:Key="bool2VisibilityConverter" />

<Color x:Key="WindowBackgroundColor">#FF2D2D30</Color>
<Color x:Key="HighlightColor">#FF3F3F41</Color>
<Color x:Key="BlueColor">#FF007ACC</Color>
<Color x:Key="ForegroundColor">#FFF4F4F5</Color>

<SolidColorBrush x:Key="WindowBackgroundColorBrush" Color="{StaticResource WindowBackgroundColor}"/>
<SolidColorBrush x:Key="HighlightColorBrush" Color="{StaticResource HighlightColor}"/>
<SolidColorBrush x:Key="BlueColorBrush" Color="{StaticResource BlueColor}"/>
<SolidColorBrush x:Key="ForegroundColorBrush" Color="{StaticResource ForegroundColor}"/>

<Style x:Key="WindowButtonStyle" TargetType="{x:Type Button}">
    <Setter Property="Foreground" Value="{DynamicResource ForegroundColorBrush}" />
    <Setter Property="Background" Value="Transparent" />
    <Setter Property="HorizontalContentAlignment" Value="Center" />
    <Setter Property="VerticalContentAlignment" Value="Center" />
    <Setter Property="Padding" Value="1" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Button}">
                <Grid Background="{TemplateBinding Background}">
                    <ContentPresenter x:Name="contentPresenter"
                          HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                          VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                          SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
                          Margin="{TemplateBinding Padding}"
                          RecognizesAccessKey="True" />
                </Grid>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsMouseOver" Value="True">
                        <Setter Property="Background" Value="{StaticResource HighlightColorBrush}" />
                    </Trigger>
                    <Trigger Property="IsPressed" Value="True">
                        <Setter Property="Background" Value="{DynamicResource BlueColorBrush}" />
                    </Trigger>
                    <Trigger Property="IsEnabled" Value="false">
                        <Setter TargetName="contentPresenter" Property="Opacity" Value=".5" />
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

<Style x:Key="MyWindowStyle" TargetType="local:MyWindow">
    <Setter Property="Foreground" Value="{DynamicResource ForegroundColorBrush}" />
    <Setter Property="Background" Value="{DynamicResource WindowBackgroundBrush}"/>
    <Setter Property="ResizeMode" Value="CanResizeWithGrip" />
    <Setter Property="UseLayoutRounding" Value="True" />
    <Setter Property="TextOptions.TextFormattingMode" Value="Display" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="local:MyWindow">
                <Border x:Name="WindowBorder" Margin="{Binding Source={x:Static SystemParameters.WindowNonClientFrameThickness}}" Background="{StaticResource WindowBackgroundColorBrush}">
                    <Grid>
                        <Border BorderThickness="1">
                            <AdornerDecorator>
                                <Grid x:Name="LayoutRoot">
                                    <Grid.RowDefinitions>
                                        <RowDefinition Height="25" />
                                        <RowDefinition Height="*" />
                                        <RowDefinition Height="15" />
                                    </Grid.RowDefinitions>
                                    <ContentPresenter Grid.Row="1" Grid.RowSpan="2" Margin="7"/>
                                    <Rectangle x:Name="HeaderBackground" Height="25" Fill="{DynamicResource WindowBackgroundColorBrush}" VerticalAlignment="Top" Grid.Row="0"/>
                                    <StackPanel Orientation="Horizontal" HorizontalAlignment="Right" VerticalAlignment="Top" WindowChrome.IsHitTestVisibleInChrome="True" Grid.Row="0">
                                        <Button Command="{Binding Source={x:Static SystemCommands.MinimizeWindowCommand}}" ToolTip="minimize" Style="{StaticResource WindowButtonStyle}">
                                            <Button.Content>
                                                <Grid Width="30" Height="25" RenderTransform="1,0,0,1,0,1">
                                                    <Path Data="M0,6 L8,6 Z" Width="8" Height="7" VerticalAlignment="Center" HorizontalAlignment="Center"
                                                        Stroke="{Binding Foreground, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Button}}" StrokeThickness="2"  />
                                                </Grid>
                                            </Button.Content>
                                        </Button>
                                        <Grid Margin="1,0,1,0">
                                            <Button x:Name="Restore" Command="{Binding Source={x:Static SystemCommands.RestoreWindowCommand}}" ToolTip="restore" Visibility="Collapsed" Style="{StaticResource WindowButtonStyle}">
                                                <Button.Content>
                                                    <Grid Width="30" Height="25" UseLayoutRounding="True" RenderTransform="1,0,0,1,.5,.5">
                                                        <Path Data="M2,0 L8,0 L8,6 M0,3 L6,3 M0,2 L6,2 L6,8 L0,8 Z" Width="8" Height="8" VerticalAlignment="Center" HorizontalAlignment="Center"
                                                            Stroke="{Binding Foreground, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Button}}" StrokeThickness="1"  />
                                                    </Grid>
                                                </Button.Content>
                                            </Button>
                                            <Button x:Name="Maximize" Command="{Binding Source={x:Static SystemCommands.MaximizeWindowCommand}}" ToolTip="maximize" Style="{StaticResource WindowButtonStyle}">
                                                <Button.Content>
                                                    <Grid Width="31" Height="25">
                                                        <Path Data="M0,1 L9,1 L9,8 L0,8 Z" Width="9" Height="8" VerticalAlignment="Center" HorizontalAlignment="Center"
                                                            Stroke="{Binding Foreground, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Button}}" StrokeThickness="2"  />
                                                    </Grid>
                                                </Button.Content>
                                            </Button>
                                        </Grid>
                                        <Button Command="{Binding Source={x:Static SystemCommands.CloseWindowCommand}}" ToolTip="close"  Style="{StaticResource WindowButtonStyle}">
                                            <Button.Content>
                                                <Grid Width="30" Height="25" RenderTransform="1,0,0,1,0,1">
                                                    <Path Data="M0,0 L8,7 M8,0 L0,7 Z" Width="8" Height="7" VerticalAlignment="Center" HorizontalAlignment="Center"
                                                        Stroke="{Binding Foreground, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Button}}" StrokeThickness="1.5"  />
                                                </Grid>
                                            </Button.Content>
                                        </Button>
                                    </StackPanel>
                                    <TextBlock x:Name="WindowTitleTextBlock" Grid.Row="0" Text="{TemplateBinding Title}" HorizontalAlignment="Left" TextTrimming="CharacterEllipsis" VerticalAlignment="Center"  Margin="8 -1 0 0"  FontSize="16"  Foreground="{TemplateBinding Foreground}"/>
                                    <Grid Grid.Row="2">
                                        <Path x:Name="ResizeGrip" Visibility="Collapsed" Width="12" Height="12" Margin="1" HorizontalAlignment="Right"
                                        Stroke="{StaticResource BlueColorBrush}" StrokeThickness="1" Stretch="None" Data="F1 M1,10 L3,10 M5,10 L7,10 M9,10 L11,10 M2,9 L2,11 M6,9 L6,11 M10,9 L10,11 M5,6 L7,6 M9,6 L11,6 M6,5 L6,7 M10,5 L10,7 M9,2 L11,2 M10,1 L10,3" />
                                    </Grid>
                                </Grid>
                            </AdornerDecorator>
                        </Border>
                        <Border BorderBrush="{StaticResource BlueColorBrush}" BorderThickness="1" Visibility="{Binding IsActive, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Converter={StaticResource bool2VisibilityConverter}}" />
                    </Grid>
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="WindowState" Value="Maximized">
                        <Setter TargetName="Maximize" Property="Visibility" Value="Collapsed" />
                        <Setter TargetName="Restore" Property="Visibility" Value="Visible" />
                        <Setter TargetName="LayoutRoot" Property="Margin" Value="7" />
                    </Trigger>
                    <Trigger Property="WindowState" Value="Normal">
                        <Setter TargetName="Maximize" Property="Visibility" Value="Visible" />
                        <Setter TargetName="Restore" Property="Visibility" Value="Collapsed" />
                    </Trigger>
                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition Property="ResizeMode" Value="CanResizeWithGrip" />
                            <Condition Property="WindowState" Value="Normal" />
                        </MultiTrigger.Conditions>
                        <Setter TargetName="ResizeGrip" Property="Visibility" Value="Visible" />
                    </MultiTrigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Setter Property="WindowChrome.WindowChrome">
        <Setter.Value>
            <WindowChrome CornerRadius="0" GlassFrameThickness="1" UseAeroCaptionButtons="False" />
        </Setter.Value>
    </Setter>
</Style>

내가 선택한 솔루션은 MahApps.Metro ( github ) 였습니다. ( github ) (지금은 두 가지 소프트웨어에서 사용 한 후) 훌륭한 UI 키트 ( Oliver Vogel 에게 제안)를 고려 합니다.

창 스타일

필요한 노력을 거의 들이지 않고 응용 프로그램을 스키닝하고 표준 Windows 8 컨트롤을 적용했습니다. 매우 견고합니다.

텍스트 상자 워터 마크

Nuget에서 사용할 수있는 버전은 다음과 같습니다.

GUI를 사용하여 Nuget (프로젝트를 마우스 오른쪽 단추로 클릭하고 Nuget 참조 관리, 'MahApps.Metro'검색)을 통해 또는 콘솔을 통해 MahApps.Metro를 설치할 수 있습니다.

PM> 설치 패키지 MahApps.Metro

또한 상업적 용도로 무료 입니다.

2013 년 10 월 29 일 업데이트 :

나는 Github 버전의 MahApps.Metro가 다음을 포함하여 현재 너겟 버전에서 사용할 수없는 컨트롤과 스타일로 포장되어 있음을 발견했습니다.

데이터 그리드 :

여기에 이미지 설명을 입력하십시오

클린 윈도우 :

여기에 이미지 설명을 입력하십시오

플라이 아웃 :

여기에 이미지 설명을 입력하십시오

타일 ​​:

여기에 이미지 설명을 입력하십시오

github 저장소는 약간의 사용자 기여로 매우 활발합니다. 확인하시기 바랍니다.


WPF에 Modern UI를 추천 합니다.

그것은 매우 활동적인 관리자가 있으며 굉장하고 무료입니다!

WPF 용 최신 UI (샘플 응용 프로그램의 스크린 샷)

나는 현재 일부 프로젝트를 MUI로 포팅하고 있습니다. 첫 번째 (그리고 두 번째) 인상은 와우입니다!

MUI의 실제 작동 상태를 보려면 MUI를 기반으로하는 XAML Spy다운로드 할 수 있습니다.

편집 : WPF에 현대 UI를 사용하여 몇 달간 나는 그것을 좋아합니다!


위의 소스가있는 Viktor La Croix 답변기반으로 다음을 사용하도록 변경합니다.

Marlett 글꼴 예

최소화, 복원 / 최대화 및 닫기 버튼에 경로 데이터 포인트 대신 Marlett 글꼴을 사용하는 것이 좋습니다.

<StackPanel Orientation="Horizontal" HorizontalAlignment="Right" VerticalAlignment="Top" WindowChrome.IsHitTestVisibleInChrome="True" Grid.Row="0">
<Button Command="{Binding Source={x:Static SystemCommands.MinimizeWindowCommand}}" ToolTip="minimize" Style="{StaticResource WindowButtonStyle}">
    <Button.Content>
        <Grid Width="30" Height="25">
            <TextBlock Text="0" FontFamily="Marlett" FontSize="14" VerticalAlignment="Center" HorizontalAlignment="Center" Padding="3.5,0,0,3" />
        </Grid>
    </Button.Content>
</Button>
<Grid Margin="1,0,1,0">
    <Button x:Name="Restore" Command="{Binding Source={x:Static SystemCommands.RestoreWindowCommand}}" ToolTip="restore" Visibility="Collapsed" Style="{StaticResource WindowButtonStyle}">
        <Button.Content>
            <Grid Width="30" Height="25" UseLayoutRounding="True">
                <TextBlock Text="2" FontFamily="Marlett" FontSize="14" VerticalAlignment="Center" HorizontalAlignment="Center" Padding="2,0,0,1" />
            </Grid>
        </Button.Content>
    </Button>
    <Button x:Name="Maximize" Command="{Binding Source={x:Static SystemCommands.MaximizeWindowCommand}}" ToolTip="maximize" Style="{StaticResource WindowButtonStyle}">
        <Button.Content>
            <Grid Width="31" Height="25">
                <TextBlock Text="1" FontFamily="Marlett" FontSize="14" VerticalAlignment="Center" HorizontalAlignment="Center" Padding="2,0,0,1" />
            </Grid>
        </Button.Content>
    </Button>
</Grid>
<Button Command="{Binding Source={x:Static SystemCommands.CloseWindowCommand}}" ToolTip="close"  Style="{StaticResource WindowButtonStyle}">
    <Button.Content>
        <Grid Width="30" Height="25">
            <TextBlock Text="r" FontFamily="Marlett" FontSize="14" VerticalAlignment="Center" HorizontalAlignment="Center" Padding="0,0,0,1" />
        </Grid>
    </Button.Content>
</Button>


당신이 기꺼이 지불하려는 경우 WPF에 대한 Telerik 구성 요소를 강력히 권장합니다 . 멋진 스타일 / 테마 를 제공하며 Office 2013 및 Windows 8 (EDIT : 및 Visual Studio 2013 테마 스타일)에 대한 특정 테마가 있습니다. 그러나 실제로 스타일 이상의 것을 제공하는 것은 실제로 유용한 많은 컨트롤을 얻을 수 있습니다.

실제 모습은 다음과 같습니다 (텔레 릭 샘플에서 가져온 스크린 샷).

Telerik 대시 보드 샘플

Telerik CRM 대시 보드 샘플

다음은 Telerik Executive 대시 보드 샘플 (첫 번째 스크린 샷) 에 대한 링크 CRM 대시 보드 (두 번째 스크린 샷)에 대한 링크입니다.

그들은 30 일의 평가판을 제공합니다.


선택적인 빛나는 테두리가 있는이 WPF 메트로 스타일 창을 살펴보십시오 .

이 옵션은 Microsoft.Windows.Shell (포함) 이외의 다른 라이브러리를 사용하여 선택적으로 빛나는 테두리가있는 메트로 스타일 창을 만드는 독립 실행 형 응용 프로그램입니다.

XP (.NET4)까지 Windows를 지원합니다.

참고 URL : https://stackoverflow.com/questions/13592326/making-wpf-applications-look-metro-styled-even-in-windows-7-window-chrome-t

반응형