【问题标题】:Using XAML with custom control将 XAML 与自定义控件一起使用
【发布时间】:2014-07-03 13:22:29
【问题描述】:

我有一个从 Control 和一些 Path XAML 源代码派生的自定义 WPF 控件:

<Path Width="16" Height="16" Margin="6,0,0,0" x:Key="CheckMark" SnapsToDevicePixels="False" Stroke="Black" Fill="Black" StrokeThickness="1"
     Data="M 12.4227,0.00012207C 12.4867,0.126587 12.5333,0.274536 
      12.6787,0.321411C 9.49199,3.24792 6.704,6.57336 
      4.69865,10.6827C 4.04399,11.08 3.47066,11.5573 2.83199,
      11.9706C 2.09467,10.2198 1.692,8.13196 3.8147e-006,
      7.33606C 0.500004,6.79871 1.31733,6.05994 1.93067,6.2428C 
      2.85999,6.51868 3.14,7.9054 3.60399,8.81604C 5.80133,
      5.5387 8.53734,2.19202 12.4227,0.00012207 Z " />

应该在控件的 OnRender 中使用该 Path 来绘制一些复选标记。

问题是我应该把这个 XAML 路径放在哪里?我的自定义控件没有自己的 XAML 文件,但它具有在 Generic.xaml 中声明的默认样式

<Style TargetType="{x:Type layers:TargetsGrid}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type layers:TargetsGrid}">
                <Border Background="{TemplateBinding Background}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}">
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

显然,我可以将 Path 类型的依赖属性添加到控件并以默认样式分配它,但是有更简单的方法吗?也许我应该将我的路径放置到某个单独的 XAML 文件中?

【问题讨论】:

  • Generic.xaml 文件是我放置它的地方。这有什么问题?
  • 我不喜欢这个 var uri = String.Format("pack://application:,,,/{0};Component/Themes/Generic.xaml", System.Reflection.Assembly.GetExecutingAssembly( ).GetName().Name);最好摆脱 "pack://application:,,,/{0};Component/Themes/Generic.xaml" 并使用 Path 类型的依赖属性

标签: wpf


【解决方案1】:

为什么不把它放在边界内?

    <ControlTemplate TargetType="{x:Type layers:TargetsGrid}">
        <Border Background="{TemplateBinding Background}"
                BorderBrush="{TemplateBinding BorderBrush}"
                BorderThickness="{TemplateBinding BorderThickness}">

            <Path ... />

        </Border>
    </ControlTemplate>

【讨论】:

  • 因为它是一个复选标记,您可能希望根据用户交互设置的布尔属性切换可见性...
  • 我在 OnRender() 中绘制了多个复选标记,这些复选标记的个数和坐标取决于 C# 代码中处理的各种参数。
【解决方案2】:

您可以创建一个单独的 ResourceDictionary 并将您的路径放入其中,然后执行以下操作:

//Pseudo code, not tested
var resourcs = new ResourceDictionary(new Uri("path to your ResourceDictionary"))
var path = (Path)resources["MyPath"];

如果您不打算重用路径,也可以完全在代码中创建路径。

或者您可以将它与 ControlTemplate 一起保存在 Generic.xaml 中,我认为这样做并没有什么问题。

【讨论】:

  • 我试过了,它可以工作,但是这段代码比 Path 类型的依赖属性更复杂。
猜你喜欢
  • 2016-04-23
  • 2018-03-07
  • 1970-01-01
  • 2013-03-29
  • 1970-01-01
  • 1970-01-01
  • 2017-09-30
  • 2017-07-04
  • 2018-04-01
相关资源
最近更新 更多