以编程方式将 FrameworkElement 分配给控件模板
Assign a FrameworkElement to a control template programatically
我正在尝试自定义绘制 GridSplitter,我有以下 XAML 代码:
<GridSplitter Grid.Column="1" Width="50" HorizontalAlignment="Stretch">
<GridSplitter.Template>
<ControlTemplate TargetType="{x:Type GridSplitter}">
<custom:DiffSplitterCanvas />
</ControlTemplate>
</GridSplitter.Template>
</GridSplitter>
DiffSplitterCanvas
继承自 Canvas
.
我需要以编程方式编写。我还需要它来使用 DiffSplitterCanvas
的给定 已经创建的实例 。简化代码,它会是这样的:
GridSplitter mySplitter = new GridSplitter();
ControlTemplate myTemplate = new ControlTemplate(typeof(GridSplitter));
DiffSplitterCanvas myCanvas = new DiffSplitterCanvas();
AddElementToTemplate(myCanvas, myTemplate);
mySplitter.Template = myTemplate;
void AddElementToTemplate(FrameworkElement element, ControlTemplate template)
{
// how could achieve this?
}
编辑: 我问这个问题的原因是因为我需要在用户与 UI 交互时更改 DiffSplitterCanvas 实例中的一些属性。也许这不是使用 WPF 实现它的方法,但我真的迷失在这里。
正确的方法是使用绑定和依赖属性。您可以在纯过程代码中执行此操作,但这将过于复杂且容易出错。
您可以在 official documentation. There is also some good tutorials.
中获得依赖属性的概览
假设您在 DiffSplitterCanvas
中声明了一个名为 MyProperty
的依赖项 属性,最后您将得到如下内容:
<GridSplitter Grid.Column="1" Width="50" HorizontalAlignment="Stretch">
<GridSplitter.Template>
<ControlTemplate TargetType="{x:Type GridSplitter}">
<custom:DiffSplitterCanvas
MyProperty="{Binding Path=SomeOtherPropertyFromDataContext}"/>
</ControlTemplate>
</GridSplitter.Template>
</GridSplitter>
只要 SomeOtherPropertyFromDataContext
的值发生变化,它就会反映在 DiffSplitterCanvas
上。请注意,您需要相应地配置绑定的 Source
属性,具体取决于持有 SomeOtherPropertyFromDataContext
属性 的内容(可能是列的上下文、父控件、视图型号等)。
我正在尝试自定义绘制 GridSplitter,我有以下 XAML 代码:
<GridSplitter Grid.Column="1" Width="50" HorizontalAlignment="Stretch">
<GridSplitter.Template>
<ControlTemplate TargetType="{x:Type GridSplitter}">
<custom:DiffSplitterCanvas />
</ControlTemplate>
</GridSplitter.Template>
</GridSplitter>
DiffSplitterCanvas
继承自 Canvas
.
我需要以编程方式编写。我还需要它来使用 DiffSplitterCanvas
的给定 已经创建的实例 。简化代码,它会是这样的:
GridSplitter mySplitter = new GridSplitter();
ControlTemplate myTemplate = new ControlTemplate(typeof(GridSplitter));
DiffSplitterCanvas myCanvas = new DiffSplitterCanvas();
AddElementToTemplate(myCanvas, myTemplate);
mySplitter.Template = myTemplate;
void AddElementToTemplate(FrameworkElement element, ControlTemplate template)
{
// how could achieve this?
}
编辑: 我问这个问题的原因是因为我需要在用户与 UI 交互时更改 DiffSplitterCanvas 实例中的一些属性。也许这不是使用 WPF 实现它的方法,但我真的迷失在这里。
正确的方法是使用绑定和依赖属性。您可以在纯过程代码中执行此操作,但这将过于复杂且容易出错。
您可以在 official documentation. There is also some good tutorials.
中获得依赖属性的概览假设您在 DiffSplitterCanvas
中声明了一个名为 MyProperty
的依赖项 属性,最后您将得到如下内容:
<GridSplitter Grid.Column="1" Width="50" HorizontalAlignment="Stretch">
<GridSplitter.Template>
<ControlTemplate TargetType="{x:Type GridSplitter}">
<custom:DiffSplitterCanvas
MyProperty="{Binding Path=SomeOtherPropertyFromDataContext}"/>
</ControlTemplate>
</GridSplitter.Template>
</GridSplitter>
只要 SomeOtherPropertyFromDataContext
的值发生变化,它就会反映在 DiffSplitterCanvas
上。请注意,您需要相应地配置绑定的 Source
属性,具体取决于持有 SomeOtherPropertyFromDataContext
属性 的内容(可能是列的上下文、父控件、视图型号等)。