wpf WindowTextBrushKey在运行时期间值在VS中更改之前不会从应用程序资源加载

yuvru6vn  于 2023-01-18  发布在  其他
关注(0)|答案(1)|浏览(144)

我正在尝试将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);
    }

顺便说一句,我愿意寻找更好的方法来完成我想完成的事情。我基本上希望我的应用程序在黑暗模式下运行,或者更好地尊重用户对黑暗或光明模式的选择。听起来这可能是应该“只是工作”的东西,但它似乎不适合我。所以我的计划是覆盖系统颜色,为大多数控件创建默认方案,然后从那里覆盖任何有问题的控件。
我找到的大多数指南都推荐了这种方法,或者似乎依赖于一些我不想依赖的框架。

kqlmhetl

kqlmhetl1#

我建议使用用户控件而不是页面。
当我用一个用户控件尝试这个时,它工作正常。
框架和页面有很多缺点。似乎这种行为是我以前没有注意到的。
框架有一堆副作用隔离页面,保持状态和一般复杂的事情,我通常不觉得需要复杂。
框架和页面对于类似“向导”的场景非常有用,在这种场景中,用户输入一系列视图,并可能希望在视图之间来回切换。在这种场景中,框架和页面添加功能是值得的。
但是用户控制。
如果我有用户控件:

<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,它只有一个内容呈现器,它的内容被绑定到数据上下文。模板化它的内容。
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。如果是外部软件,可以考虑网络和应用程序的洞察力。
即使对我来说,这也是一个庞大的帖子,希望这能有所帮助。

相关问题