Orchestra.MahApps 自定义 window
Orchestra.MahApps custom window
我正在尝试使用 Orchestra 框架创建自定义 MahApps.Metro window。
我复制了当前的 ShellWindow 内容(视图 + 代码隐藏)并创建了我自己的 Window。然后在 App.xaml.cs
中我使用了我的 window 而不是 ShellWindow
像这样:
shellService.CreateWithSplash<MyShellWindowView>()
问题是,这个 window 的样式不正确(例如,minimize/max/close 按钮)
这是我的 window:
<orchestra:MetroDataWindow x:Class="CatelApp.Views.MyShellWindowView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:catel="http://catel.codeplex.com"
xmlns:orchestra="https://github.com/orcomp/orchestra"
SaveWindowPosition="False" d:DesignHeight="696" d:DesignWidth="480" mc:Ignorable="d">
<orchestra:MetroDataWindow.Resources>
<ResourceDictionary>
<Style TargetType="catel:TabControl" BasedOn="{StaticResource {x:Type TabControl}}" />
</ResourceDictionary>
</orchestra:MetroDataWindow.Resources>
<Border x:Name="border" BorderThickness="1">
<DockPanel LastChildFill="True" Margin="15, 5, 15, 5">
<StatusBar x:Name="statusBar" DockPanel.Dock="Bottom">
<orchestra:AnimatingTextBlock x:Name="statusTextBlock" HorizontalAlignment="Left" VerticalAlignment="Center">
<orchestra:AnimatingTextBlock.ShowStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetProperty="Opacity" To="1.0" Duration="0:0:0.2"/>
</Storyboard>
</orchestra:AnimatingTextBlock.ShowStoryboard>
<orchestra:AnimatingTextBlock.HideStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetProperty="Opacity" To="0.0" Duration="0:0:0.2"/>
</Storyboard>
</orchestra:AnimatingTextBlock.HideStoryboard>
</orchestra:AnimatingTextBlock>
</StatusBar>
<ContentControl x:Name="contentControl" />
</DockPanel>
</Border>
</orchestra:MetroDataWindow>
和代码隐藏
namespace CatelApp.Views
{
/// <summary>
/// Interaction logic for MyShellWindowViewModel.xaml
/// </summary>
public partial class MyShellWindowView : MetroDataWindow, IShell
{
#region Constructors
/// <summary>
/// Initializes a new instance of the <see cref="ShellWindow"/> class.
/// </summary>
public MyShellWindowView()
{
var serviceLocator = ServiceLocator.Default;
var themeService = serviceLocator.ResolveType<IThemeService>();
ThemeHelper.EnsureApplicationThemes(GetType().Assembly, themeService.ShouldCreateStyleForwarders());
MahAppsHelper.ApplyTheme();
InitializeComponent();
var accentColorBrush = ThemeHelper.GetAccentColorBrush();
border.BorderBrush = accentColorBrush;
var statusService = serviceLocator.ResolveType<IStatusService>();
statusService.Initialize(statusTextBlock);
var commandManager = serviceLocator.ResolveType<ICommandManager>();
var flyoutService = serviceLocator.ResolveType<IFlyoutService>();
var mahAppsService = serviceLocator.ResolveType<IMahAppsService>();
serviceLocator.RegisterInstance<IAboutInfoService>(mahAppsService);
var flyouts = new FlyoutsControl();
foreach (var flyout in flyoutService.GetFlyouts())
{
flyouts.Items.Add(flyout);
}
Flyouts = flyouts;
var windowCommands = mahAppsService.GetRightWindowCommands();
if (mahAppsService.GetAboutInfo() != null)
{
// var aboutWindowCommand = WindowCommandHelper.CreateWindowCommandButton("appbar_information", "about");
// var aboutService = serviceLocator.ResolveType<IAboutService>();
// commandManager.RegisterAction("Help.About", aboutService.ShowAbout);
// aboutWindowCommand.Command = commandManager.GetCommand("Help.About");
// windowCommands.Items.Add(aboutWindowCommand);
}
RightWindowCommands = windowCommands;
var mainView = mahAppsService.GetMainView();
contentControl.Content = mainView;
SetBinding(TitleProperty, new Binding("ViewModel.Title") {Source = mainView});
}
#endregion
}
}
您的应用资源中是否包含 MahApps 主题?例如,看下面的代码:
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/Resources/Icons.xaml" />
<ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Controls.xaml" />
<ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Fonts.xaml" />
<ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Colors.xaml" />
<ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Controls.AnimatedTabControl.xaml" />
</ResourceDictionary.MergedDictionaries>
我正在尝试使用 Orchestra 框架创建自定义 MahApps.Metro window。
我复制了当前的 ShellWindow 内容(视图 + 代码隐藏)并创建了我自己的 Window。然后在 App.xaml.cs
中我使用了我的 window 而不是 ShellWindow
像这样:
shellService.CreateWithSplash<MyShellWindowView>()
问题是,这个 window 的样式不正确(例如,minimize/max/close 按钮)
这是我的 window:
<orchestra:MetroDataWindow x:Class="CatelApp.Views.MyShellWindowView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:catel="http://catel.codeplex.com"
xmlns:orchestra="https://github.com/orcomp/orchestra"
SaveWindowPosition="False" d:DesignHeight="696" d:DesignWidth="480" mc:Ignorable="d">
<orchestra:MetroDataWindow.Resources>
<ResourceDictionary>
<Style TargetType="catel:TabControl" BasedOn="{StaticResource {x:Type TabControl}}" />
</ResourceDictionary>
</orchestra:MetroDataWindow.Resources>
<Border x:Name="border" BorderThickness="1">
<DockPanel LastChildFill="True" Margin="15, 5, 15, 5">
<StatusBar x:Name="statusBar" DockPanel.Dock="Bottom">
<orchestra:AnimatingTextBlock x:Name="statusTextBlock" HorizontalAlignment="Left" VerticalAlignment="Center">
<orchestra:AnimatingTextBlock.ShowStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetProperty="Opacity" To="1.0" Duration="0:0:0.2"/>
</Storyboard>
</orchestra:AnimatingTextBlock.ShowStoryboard>
<orchestra:AnimatingTextBlock.HideStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetProperty="Opacity" To="0.0" Duration="0:0:0.2"/>
</Storyboard>
</orchestra:AnimatingTextBlock.HideStoryboard>
</orchestra:AnimatingTextBlock>
</StatusBar>
<ContentControl x:Name="contentControl" />
</DockPanel>
</Border>
</orchestra:MetroDataWindow>
和代码隐藏
namespace CatelApp.Views
{
/// <summary>
/// Interaction logic for MyShellWindowViewModel.xaml
/// </summary>
public partial class MyShellWindowView : MetroDataWindow, IShell
{
#region Constructors
/// <summary>
/// Initializes a new instance of the <see cref="ShellWindow"/> class.
/// </summary>
public MyShellWindowView()
{
var serviceLocator = ServiceLocator.Default;
var themeService = serviceLocator.ResolveType<IThemeService>();
ThemeHelper.EnsureApplicationThemes(GetType().Assembly, themeService.ShouldCreateStyleForwarders());
MahAppsHelper.ApplyTheme();
InitializeComponent();
var accentColorBrush = ThemeHelper.GetAccentColorBrush();
border.BorderBrush = accentColorBrush;
var statusService = serviceLocator.ResolveType<IStatusService>();
statusService.Initialize(statusTextBlock);
var commandManager = serviceLocator.ResolveType<ICommandManager>();
var flyoutService = serviceLocator.ResolveType<IFlyoutService>();
var mahAppsService = serviceLocator.ResolveType<IMahAppsService>();
serviceLocator.RegisterInstance<IAboutInfoService>(mahAppsService);
var flyouts = new FlyoutsControl();
foreach (var flyout in flyoutService.GetFlyouts())
{
flyouts.Items.Add(flyout);
}
Flyouts = flyouts;
var windowCommands = mahAppsService.GetRightWindowCommands();
if (mahAppsService.GetAboutInfo() != null)
{
// var aboutWindowCommand = WindowCommandHelper.CreateWindowCommandButton("appbar_information", "about");
// var aboutService = serviceLocator.ResolveType<IAboutService>();
// commandManager.RegisterAction("Help.About", aboutService.ShowAbout);
// aboutWindowCommand.Command = commandManager.GetCommand("Help.About");
// windowCommands.Items.Add(aboutWindowCommand);
}
RightWindowCommands = windowCommands;
var mainView = mahAppsService.GetMainView();
contentControl.Content = mainView;
SetBinding(TitleProperty, new Binding("ViewModel.Title") {Source = mainView});
}
#endregion
}
}
您的应用资源中是否包含 MahApps 主题?例如,看下面的代码:
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/Resources/Icons.xaml" />
<ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Controls.xaml" />
<ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Fonts.xaml" />
<ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Colors.xaml" />
<ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Controls.AnimatedTabControl.xaml" />
</ResourceDictionary.MergedDictionaries>