WPF应用复杂皮肤

时间:2009-04-22 18:24:52

标签: wpf skinning

我正在试图找出如何使用复杂资源为应用程序设置外观。

我有一个皮肤文件,其中放置了包含复杂图稿的Canvas。像这样:

<ResourceDictionary>
    <Style x:Key="MainBackground" TargetType="{x:Type Canvas}">
        <Setter Property="Canvas">
            <Setter.Value>
                <Canvas Width="1440.000" Height="900.000">
                <!-- complicated artwork here -->
                </Canvas>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>

如何将此皮肤加载到主应用程序中?我在想这样的事情:

<Window>
    <Canvas Style="{StaticResource MainBackground}"/>
</Window >

3 个答案:

答案 0 :(得分:1)

首先,不要使用Canvas明确地布置控件。使用其他Panel类型(例如GridDockPanel)。

其次,您可以像这样导入ResourceDictionary

<Window>
    <Window.Resources>
        <ResourceDictionary Source="YourDictionary.xaml"/>
    </Window.Resources>
</Window>

或者您可以合并多个ResourceDictionary,如下所示:

<Window>
    <Window.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="YourDictionary.xaml"/>
                <ResourceDictionary Source="YourOtherDictionary.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>

        <SolidColorBrush x:Key="SomeLocalResource">Red</SolidColorBrush>
    </Window.Resources>
</Window>

答案 1 :(得分:1)

如果我正确理解了这个问题:您可以从导出的XAML文件的根视觉创建可视化画笔,并将其用作另一个画布的画笔。

答案 2 :(得分:1)

我知道这是一个老问题......但是有几种方法可以解决这个问题。希望这对谷歌搜索者有所帮助,我将分享两种方式。

首先,您可以简单地将一个Viewbox放在Canvas 周围(您从转换后的.ai文件中获取)。请注意,您可能必须使用Stretch和alignment属性来使其按照您的意愿运行...但很可能您将Stretch设置为UniformToFill并将对齐属性设置为Center:

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="BackgroundSkin.MainWindow"
    x:Name="Window"
    Width="640"
    Height="480"
>
    <Grid x:Name="LayoutRoot">
        <Viewbox
            Stretch="UniformToFill"
            HorizontalAlignment="Center"
            VerticalAlignment="Center"
        >
            <!-- Replace the following Canvas with yours. -->
            <Canvas Background="White"/>
        </Viewbox>
    </Grid>
</Window>

其次,如果您希望拥有更多可共享的内容(这样您可以将其用作多个Windows上的背景),您可以使用该艺术作品创建一个画笔。有几种方法去做这个。第一个是简单地意识到您可以使用Expression Design将.ai文件转换为DrawingBrush(即Expression Design可以以两种主要方式导出:Canvas / Shape(s)或ResourceDictionary / Brush(es))。

如果你没有原始的.ai / .design文件进行重新导出,你可以在Canvas上创建一个VisualBrush(正如@Ugar Turan建议的那样)。请注意,这次你可能不得不在VisualBrush上使用Stretch属性(以及其他属性):

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="BackgroundSkin.MainWindow"
    x:Name="Window"
    Width="640"
    Height="480"
    Background="{DynamicResource backgroundBrush}"    
>
    <Window.Resources>
        <!-- Replace the following Canvas with yours. -->
        <Canvas x:Key="backgroundCanvas"/>
        <VisualBrush
            x:Key="backgroundBrush"
            Visual="{DynamicResource backgroundCanvas}"
            Stretch="UniformToFill"
        />
    </Window.Resources>
</Window>