我正在尝试自定义绘制GridSplitter,并且我有以下XAML代码:

<GridSplitter Grid.Column="1" Width="50" HorizontalAlignment="Stretch">
    <GridSplitter.Template>
        <ControlTemplate TargetType="{x:Type GridSplitter}">
            <custom:DiffSplitterCanvas />
        </ControlTemplate>
    </GridSplitter.Template>
</GridSplitter>


DiffSplitterCanvasCanvas继承。

我需要以编程方式编写它。我还需要它使用给定的已经创建的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中获得依赖项属性的概述。还有some good tutorials

假设您在MyProperty中声明了一个名为DiffSplitterCanvas的依赖项属性,最后您将获得类似以下内容的信息:

<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属性的内容(可能是列的上下文,父控件,视图模型等)。

09-26 03:05