未从应用程序加载WindowTextBrushKey.资源,直到值在运行时在VS中改变



我试图将SystemColors.WindowTextBrushKey设置为白色:

<Application x:Class="MN.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:MN"
Startup="Application_Startup"
DispatcherUnhandledException="Application_DispatcherUnhandledException">
<Application.Resources>
<SolidColorBrush x:Key="{x:Static SystemColors.WindowTextBrushKey}" Color="#FFF" />
</Application.Resources>
</Application>

使用此颜色的控件最初显示的不是白色,而是黑色。它保持黑色,直到我在vs中修改这个特定的XAMLColor属性。一旦我将其更改为任何其他值,该值就会受到尊重,直到我再次加载应用程序,此时它会恢复为黑色。

大多数(如果不是全部)其他SystemColors.*Key值似乎按预期工作。无论我设置什么值,在应用程序加载时似乎都有效。

我想知道我是否需要做一些事情来覆盖原始的默认值。我可以调用刷新/通知吗?

也考虑建设这个Application.Resources后延迟?但我在寻找一个更好/更干净的解决方案。

(编辑2023-01-16)

所以我尝试了一个文本块直接在我的窗口,这工作如预期的,但是如果我加载一个文本块通过一个页面加载到一个框架,它没有。

我的页面:

<Page x:Class="MN.TestPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
xmlns:local="clr-namespace:MN"
mc:Ignorable="d" 
d:DesignHeight="450" d:DesignWidth="800"
Title="TestPage">
<DockPanel Margin="20" VerticalAlignment="Stretch" HorizontalAlignment="Stretch">
<StackPanel DockPanel.Dock="Top" VerticalAlignment="Top" HorizontalAlignment="Stretch">
<TextBlock FontSize="36" Text="I expect this text to be not black in color."/>
</StackPanel>
</DockPanel>
</Page>

我的窗口:

<Window x:Class="MN.TestWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:MN"
mc:Ignorable="d"
Title="TestWindow" Height="702" Width="1245"
WindowState="Maximized"
Loaded="Window_Loaded">
<DockPanel>
<Frame x:Name="frame" />
</DockPanel>
</Window>

在我的窗口代码后面:

private void Window_Loaded(object sender, RoutedEventArgs e)
{
frame.Source = new Uri("TestPage.xaml", UriKind.Relative);
}
顺便说一句,我愿意接受更好的方法来完成我想要完成的事情。我基本上希望我的应用程序在黑暗模式下运行,或者更好地尊重用户对黑暗或光明模式的选择。这听起来好像是一种应该"只是工作"的东西。但它似乎不适合我,所以我的计划是覆盖系统颜色,为大多数控件创建默认方案,然后覆盖任何有问题的控件。

我找到的大多数指南都推荐这种方法,或者似乎依赖于一些我不想依赖的框架。

我推荐用户控件而不是页面。

当我在usercontrol上尝试这个时,它工作正常。

框架和页面有很多缺点。似乎这种行为是我以前没有注意到的。

框架有一些副作用,隔离页面,保留状态,并且通常会使我通常认为不需要的事情复杂化。

框架和页面对于"向导"很有用比如用户正在输入一系列视图,并且可能想要在它们之间来回切换。在这种情况下,特性框架和页面添加是值得的。

但用户控件。

如果我有一个usercontrol:

<Grid>
<TextBlock FontSize="36" Text="I expect this text to be not black in color."/>
</Grid>
</UserControl>

而不是:

private void Window_Loaded(object sender, RoutedEventArgs e)
{
this.Content = new UserControl1();
}

显示红色文本。

考虑用户控件对UI的所有封装。在考虑另一个窗口之前,先考虑一下。你只需要在一个多窗口wpf应用程序中定义两个窗口。一个是主窗口。另一个:EverythingElseWindow,它只有一个contentpresenter,它的内容被绑定到datacontext。模板出它的内容

https://social.technet.microsoft.com/wiki/contents/articles/52485.wpf-tips-and-tricks-using-contentcontrol-instead-of-frame-and-page-for-navigation.aspx

这种系统刷的方法不是我通常处理这种事情的方法。如果需要大量的重新设计样式,我建议你看看现成的主题。

重写这些系统密钥是不可靠的。你会发现控件的模板(有时非常复杂)并不总是使用这些系统刷。

错误处理程序:

private void Application_Startup(object sender, StartupEventArgs e)
{
DispatcherUnhandledException += App_DispatcherUnhandledException;
TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException;
// Get too many spurious errors when handling firstchanceexception
// AppDomain.CurrentDomain.FirstChanceException += CurrentDomain_FirstChanceException;  
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;

在生产代码中使用FirstchanceException之前,你必须非常小心你的绑定和模板。然而,在开发过程中设置此设置对于探索问题有时是有用的。

所有这些都应该通过某个中央可注入接口进行记录。如果您在编写内部软件,请使用Nlog。如果是外部的,考虑web和应用程序的见解。

即使对我来说,这篇文章也相当冗长,希望能有所帮助。

相关内容

  • 没有找到相关文章

最新更新