c# - 作为可重用 XAML 片段的矢量图像

标签 c# wpf xaml resources

我想在某些 WPF 应用程序/库中重用一些 XAML 片段作为图像。

问题背景如下:

在 WPF 应用程序中重用位图图像很容易。图片可以作为资源添加,我可以使用 <Image Source="packURI"/>在 XAML 中的许多地方,因此图像将是相同的。

但我希望有可能对矢量图像执行相同的操作。图像本身可以表示为 Path ,但我不能重复使用相同的 Path作为一种资源,因为禁止在多个不同的地方(并且可能从多个 UI 线程)简单地使用它(UI 元素只能有一个逻辑父元素)。

此外,如果我想从多个 Path 构建“图像”,问题就会变得更加复杂。 s,使用 Canvas为了它。或者一些任意的 XAML 代码。

我尝试使用 Style对于 Path ,所以图像以这样的方式表示:

<Path Style={StaticResource VectorImage1}/>

这似乎是一种可重用的方式,但我担心两个问题:

  1. 如果矢量图像的实现从 Path 改变到(例如)Canvas ,我不仅需要在样式中替换它,而且在使用它的源代码中的所有地方都需要替换它。
  2. 使用样式定义路径似乎过于冗长。
  3. 我认为无法概括这种使用 Canvas 的方法或任意 XAML 代码。
  4. 语法似乎很不自然。

还有其他方法可以通过定义 UserControl 来获得可重用的 XAML 片段。 , 但为每个矢量图像定义一个单独的用户控件似乎有点矫枉过正。

是否有更好、更好、更正确的方法来定义可重用的 XAML 片段?

最佳答案

您可以将 x:Shared 属性添加到 Path Resource 并将其用作 StaticResource。如果“MyVectorImage”更改为其他内容,这将起作用

更新
可能最好使用 ContentControl 或类似的方法来添加属性,例如边距等。

<Window.Resources>
    <Path x:Key="MyVectorImage"
          x:Shared="False"
          Stroke="DarkGoldenRod"
          StrokeThickness="3"
          Data="M 10,20 C 10,25 40,35 40,17 H 28"
          Stretch="Fill"
          Width="100"
          Height="40"/>
</Window.Resources>
<StackPanel>
    <ContentControl Margin="10" Content="{StaticResource MyVectorImage}"/>
    <ContentControl Margin="10" Content="{StaticResource MyVectorImage}"/>
</StackPanel>

例子。您将“MyVectorImage”替换为包含两个路径的 StackPanel。

<Window.Resources>
    <StackPanel x:Key="MyVectorImage"
                x:Shared="False">
        <Path Stroke="DarkGoldenRod"
              StrokeThickness="3"
              Data="M 10,20 C 10,25 40,35 40,17 H 28"
              Stretch="Fill"
              Width="100"
              Height="40"/>
        <Path Stroke="DarkGoldenRod"
              StrokeThickness="3"
              Data="M 10,20 C 10,25 40,35 40,17 H 28"
              Stretch="Fill"
              Width="100"
              Height="40"/>
    </StackPanel>
</Window.Resources>

关于c# - 作为可重用 XAML 片段的矢量图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4387349/

相关文章:

c# - 设置控件父属性和使用 Controls.Add() 之间的区别?

C# - 实时更新图表

c# - 从其他窗口刷新组合框列表,MVVM

c# - 如何从线程更新 WPF 应用程序中的 UI?

wpf - 在 XAML 中为 WPF 本地化扩展使用占位符

c# - 如何删除数据成员上的命名空间?

c# - 我应该使用什么 WPF 图像类型来执行多个转换

c# - 如何在 WPF MVVM 中使用嵌套 View

c# - 自定义 ListView 项中的背景/前景功能

c# - 在连接的节点之间画线