gpt4 book ai didi

c# - 以编程方式将 FrameworkElement 分配给控件模板

转载 作者:太空宇宙 更新时间:2023-11-03 13:07:58 24 4
gpt4 key购买 nike

我正在尝试自定义绘制 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 实现它的方式,但我真的迷失在这里。

最佳答案

正确的方法是使用绑定(bind)和依赖属性。您可以在纯过程代码中执行此操作,但这会过于复杂且容易出错。

您可以在 official documentation 中获得依赖属性的概述。 .还有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 的值发生变化时,它都会反射(reflect)在 DiffSplitterCanvas 上。请注意,您需要相应地配置绑定(bind)的 Source 属性,具体取决于持有 SomeOtherPropertyFromDataContext 属性的内容(可能是列的上下文、父控件、 View 模型等)。

关于c# - 以编程方式将 FrameworkElement 分配给控件模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30122638/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com