Создание приложений WPF в стиле Metro, даже в Windows 7? (Окно Chrome / Тематика / Тема)
Мне нравится окно chrome на новый офисный пакет и Visual Studio:
Я все еще разрабатываю приложения для Windows 7, конечно, но мне интересно, есть ли быстрый и простой способ (читай: стиль WPF или библиотека Windows) эмулировать этот стиль. Я сделал некоторые окна chrome стиль в прошлом, но заставить его выглядеть и вести себя правильно действительно сложно.
кто-нибудь знает, есть ли существующие шаблоны или библиотеки для добавления "Современный пользовательский интерфейс" выглядит и чувствует себя в моих приложениях WPF?
5 ответов:
то, что я сделал, это создание собственного окна и стиля. Потому что мне нравится контролировать все, и я не хотел, чтобы некоторые внешние библиотеки просто использовали окно из него. Я посмотрел на уже упомянутое MahApps.Метро на GitHub
а также очень приятно современный интерфейс на CodePlex. (.Серии net4.5 только)
)
есть еще один это Элизиум но я действительно не попробовать это один.
стиль, который я сделал, был очень легким, когда я посмотрел, как это делается в них. Теперь у меня есть собственное окно, и я могу делать все, что захочу с xaml... для меня это главная причина, почему я сделал мой собственный. И я сделал еще один для вас тоже :) я должен, вероятно, сказать, что я не смог бы сделать это без изучения современный пользовательский интерфейс это было большим подспорьем. Я попытался сделать его похожим на окно VS2012. Похоже этот.
вот код (обратите внимание, что это targeting. 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.Метро (github), который (после использования его на двух частях программного обеспечения сейчас) я считаю отличным UI kit (кредита Оливер Фогель предложение).
Он скины приложение с очень небольшим усилием требуется, и имеет адаптацию стандартных элементов управления Windows 8. Он очень прочный.
версия доступно на Nuget:
вы можете установить MahApps.Метро через Nuget с помощью графического интерфейса (щелкните правой кнопкой мыши ваш проект, Управление ссылками Nuget, поиск ' MahApps.Метро) или через консоль:
PM> Install-Package MahApps.Метро
кроме свободный -- даже для коммерческого использования.
10-29-2013 обновления:
Я обнаружил, что версия GitHub MahApps.Метро забито до отказа элементы управления и стили, которые недоступны в текущей версии nuget, в том числе:
Datagrids:
Чистые Окна:
меню:
плитка:
репозиторий github очень активен с довольно большим количеством вкладов пользователей. Я рекомендую проверить его.
Я бы порекомендовал современный интерфейс для WPF .
Он имеет очень активный сопровождающий это потрясающе и бесплатно!
в настоящее время я портирую некоторые проекты в MUI, первое (а тем временем второе) впечатление просто вау!
чтобы увидеть MUI в действии, вы можете скачать XAML Spy который основан на MUI.
EDIT: используя современный интерфейс для WPF несколько месяцев, и я люблю его!
на основе Виктор ла-Круа ответ С источником выше, я бы изменил его, чтобы использовать следующее:
лучше использовать шрифт 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>
Если вы готовы заплатить, я настоятельно рекомендую вам компоненты Telerik для WPF. Они предлагают большой стили/темы и есть определенные темы для обоих, Office 2013 и Windows 8 (EDIT: а также тематический стиль Visual Studio 2013). Однако предлагает гораздо больше, чем просто стили на самом деле вы получите целую кучу контроля, которые действительно полезны.
вот как это выглядит в действии (скриншоты взяты от Telerik образцы):
вот ссылки на telerik executive dashboard sample (первый скриншот) и здесь CRM Dashboard (второй скриншот).
Они предлагают 30-дневную пробную версию, просто дать ему шанс!
Comments