【问题标题】:How to use Windows 10 style resource in WPF with XAML Islands如何在 WPF 中通过 XAML 岛使用 Windows 10 样式资源
【发布时间】:2021-05-19 20:55:11
【问题描述】:

我正在使用 XAML Islands 来制作我的应用程序,并且我想在我的 WPF 应用程序中使用 Windows 10 样式,例如 here。例如<TextBlock Text="Header" Style="{StaticResource HeaderTextBlockStyle}"/> 会导致:

但这在 WPF 中不起作用(它确实在 UWP 中起作用,无需任何修改),我的理解是 XAML Islands 应该使它成为可能。当我尝试简单地将上面的代码添加到我的 xaml 文件中时,我得到了异常

找不到名为“HeaderTextBlockStyle”的资源。资源名称区分大小写。

如果我将 Style="{StaticResource HeaderTextBlockStyle}" 添加到 <xamlhost:WindowsXamlHost> 元素,我会得到同样的异常。

所以我尝试使用代码添加控件,因此我将此 WindowsXamlHost 控件添加为堆栈面板:

<xamlhost:WindowsXamlHost InitialTypeName="Windows.UI.Xaml.Controls.StackPanel" ChildChanged="WindowsXamlHost_ChildChanged"/>

并添加了此方法(在制作控件时运行的事件处理程序。从 this 学习)处理向 StackPanel 添加其他控件(TextBlock):

private void WindowsXamlHost_ChildChanged(object sender, EventArgs e)
    { 
        // Get the host control
        WindowsXamlHost host = (WindowsXamlHost)sender;
        // Get the StackPanel in the host
        Windows.UI.Xaml.Controls.StackPanel sp = (Windows.UI.Xaml.Controls.StackPanel)host.Child;
        // Make a TextBlock to add to the StackPanel
        Windows.UI.Xaml.Controls.TextBlock textBlock = new Windows.UI.Xaml.Controls.TextBlock();
        // Set the text of the TextBlock
        textBlock.Text = "LockCursorInMonitor";
        // Get the style resources, cast them to the appropriate type for XAML Islands and add them to the TextBlock
        textBlock.Style = (Windows.UI.Xaml.Style)Application.Current.Resources["HeaderTextBlockStyle"];

        // Another way to get resources but this doesn't work too.
        //textBlock.Style = (Windows.UI.Xaml.Style)this.FindResource("HeaderTextBlockStyle");

        // Add the TextBlock to the stackpanel
        sp.Children.Add(textBlock);
    }

Application.Current.Resources["HeaderTextBlockStyle"] 方式什么都不做,也不会抛出异常。

this.FindResource("HeaderTextBlockStyle") 方式抛出下一个异常:

System.Windows.ResourceReferenceKeyNotFoundException: ''HeaderTextBlockStyle' 资源未找到。'

那么如何在我的 WPF 应用程序中获取这些样式资源?

【问题讨论】:

    标签: c# wpf xaml uwp xaml-islands


    【解决方案1】:

    实现此目的的一种方法是使用包ModernWPF,但随后您将失去 XAML Islands 的所有好处(如果有的话。我需要从 XAML Islands 获得的一切都在 ModernWPF 中并且更容易实现)。

    安装和设置 ModernWPF 后,您只需使用 <TextBlock Text="Header" Style="{StaticResource HeaderTextBlockStyle}"/> 方式即可。

    【讨论】:

      猜你喜欢
      • 2010-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多