【问题标题】:WPF Application Complex SkinWPF应用复杂皮肤
【发布时间】:2009-04-22 18:24:51
【问题描述】:

我正在尝试弄清楚如何为具有复杂资源的应用程序设置外观。

我有一个皮肤文件,我在其中放入了包含复杂艺术品的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 >

【问题讨论】:

    标签: wpf skinning


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      首先,您可以简单地在 Canvas 周围放置一个 Viewbox(您从转换后的 .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 文件,您可以从画布上创建一个 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>
      

      【讨论】:

        【解决方案3】:

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

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

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

        或者你可以合并多个ResourceDictionarys如下:

        <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>
        

        【讨论】:

        • 我的问题有点不同:我有一个 xaml 文件(从 AI 转换而来),它是一个由画布和其他折线转换而成的矢量图像......我想用它作为背景。
        • 这个答案没有解决原来的问题。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-23
        • 1970-01-01
        • 2015-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多