【问题标题】:Assign a FrameworkElement to a control template programatically以编程方式将 FrameworkElement 分配给控件模板
【发布时间】:2015-05-08 11:24:11
【问题描述】:

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

【问题讨论】:

    标签: c# .net wpf controltemplate


    【解决方案1】:

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

    您可以在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 的值发生变化时,它都会反映在DiffSplitterCanvas 上。请注意,您需要相应地配置绑定的Source 属性,具体取决于持有SomeOtherPropertyFromDataContext 属性的内容(可能是列的上下文、父控件、视图模型等)。

    【讨论】:

    • 嗨,Kryptos,拜托,你能在这里写一个有效的例子吗?我无法将SomeOtherPropertyFromDataContext 分配给我的GridSplitterCanvas。提前致谢
    • 好吧。我有点已经是一个工作示例...当然SomeOtherPropertyFromDataContext 只是一个任意名称。随着用户与 UI 交互,您将获得事件并更改一些属性。因此,如果您有一个带有名为SomeOtherPropertyFromDataContext 的属性的DataContext,当您以编程方式更改此属性的值时,由于绑定,它也会更改MyProperty 的值。需要做的是在某处定义SomeOtherPropertyFromDataContext,并确保它是您放置DiffSplitterCanvas 的可访问数据上下文。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-16
    • 1970-01-01
    • 1970-01-01
    • 2017-12-17
    • 1970-01-01
    相关资源
    最近更新 更多