我正在尝试将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中修改此特定XAML Color
属性之前,它一直保持黑色。一旦我将其更改为任何其他值,则该值将得到遵守,直到我再次加载应用程序,此时它将恢复为黑色。
大多数(如果不是全部的话)其他SystemColors.*Key
值似乎都按预期工作。无论我设置的是什么值,似乎都会在应用加载时生效。
我想知道我是否需要做些什么来覆盖原来的默认值。我可以做一些刷新/通知调用吗?
也在考虑在延迟之后构建这个X1 M3 N1 X?但是在寻找更好/更清洁的解决方案。
[编辑日期:2023年1月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);
}
顺便说一句,我愿意寻找更好的方法来完成我想完成的事情。我基本上希望我的应用程序在黑暗模式下运行,或者更好地尊重用户对黑暗或光明模式的选择。听起来这可能是应该“只是工作”的东西,但它似乎不适合我。所以我的计划是覆盖系统颜色,为大多数控件创建默认方案,然后从那里覆盖任何有问题的控件。
我找到的大多数指南都推荐了这种方法,或者似乎依赖于一些我不想依赖的框架。
1条答案
按热度按时间kqlmhetl1#
我建议使用用户控件而不是页面。
当我用一个用户控件尝试这个时,它工作正常。
框架和页面有很多缺点。似乎这种行为是我以前没有注意到的。
框架有一堆副作用隔离页面,保持状态和一般复杂的事情,我通常不觉得需要复杂。
框架和页面对于类似“向导”的场景非常有用,在这种场景中,用户输入一系列视图,并可能希望在视图之间来回切换。在这种场景中,框架和页面添加功能是值得的。
但是用户控制。
如果我有用户控件:
而是:
这会显示红色文本。
考虑用户控件的所有UI封装。在考虑另一个窗口之前考虑它们。在多窗口wpf应用程序中只需要定义两个窗口。一个是主窗口。另一个是:EverythingElseWindow,它只有一个内容呈现器,它的内容被绑定到数据上下文。模板化它的内容。
https://social.technet.microsoft.com/wiki/contents/articles/52485.wpf-tips-and-tricks-using-contentcontrol-instead-of-frame-and-page-for-navigation.aspx
这种使用系统笔刷的方法不是我通常处理这类事情的方法。如果有必要进行广泛的重新样式化,我建议你看看现成的主题。
覆盖这些系统键是不可靠的。您会发现控件的模板(有时复杂得令人惊讶)并不总是使用这些系统画笔。
错误处理程序:
在生产代码中使用FirstchanceException之前,你必须非常小心地使用绑定和模板。然而,有时候,在开发过程中,设置这些绑定和模板来探索问题是很有用的。
所有这些都应该通过一些中央可注入接口记录。如果你在编写内部软件,可以使用Nlog。如果是外部软件,可以考虑网络和应用程序的洞察力。
即使对我来说,这也是一个庞大的帖子,希望这能有所帮助。