如何使默认的 TreeView (System.Windows.Controls) 具有与 RadTreeView (telerik) 相同的样式?

How to make default TreeView (System.Windows.Controls) have the same style as RadTreeView (telerik)?

我尝试简单地将 <TreeView> 更改为 <RadTreeView> 但是它弄乱了一些方法背后的代码,所以我想我可以只应用样式,但我尝试过的都不起作用。

下面的代码工作正常,我尝试将静态资源更改为 RadTreeViewItemStyle 它编译没有问题,但是我在运行时收到错误消息“Can only base on a Style with target type那是基本类型 'TreeViewItem' "

<TreeView.Resources>
  <Style BasedOn="{StaticResource MetroTreeViewItem}" TargetType="TreeViewItem">
    <Setter Property="IsSelected" Value="{Binding Path=IsSelected, Mode=TwoWay}" />
    <Setter Property="IsExpanded" Value="{Binding Path=IsExpanded, Mode=TwoWay}" />
    <Setter Property="HorizontalContentAlignment" Value="Stretch" />
    <Setter Property="VerticalContentAlignment" Value="Stretch" />
  </Style>
</TreeView.Resources>;

第一个解决方案: 你可以让你的 TreeView 扩展 RadTreeView。我认为 RadTreeView 有一些特殊的依赖属性,而且似乎也使用它自己的自定义项目容器。这就是为什么 Telerik 样式在 TreeView 上不能正常工作,尽管它首先编译。

第二种解决方案:可以提取RadTreeView样式并重构它,这样它就可以应用到WPF TreeView.

在Visual Studio中,您有两个选择。 第一个选择是遵循这 5 个简单的步骤:

  1. 转到 XAML 设计器并打开 设计窗格 (Shift+F7)
  2. Select 您希望从中提取样式的元素 (RadTreeView) 并右键单击它
  3. 在上下文菜单中 select 编辑模板 -> 编辑副本
  4. 在对话框中为新提取的样式输入名称并单击 确定
  5. 您现在回到 XAML 设计器中。寻找新的风格。它被添加到您 select 编辑元素标签以提取样式的同一个文件中,并按照您之前指定的方式命名。它通常被添加到顶级资源字典

要提取项目模板,请重复步骤 1 和 2。然后从上下文菜单中 select 编辑其他模板 -> 编辑生成的项目 (ItemTemplate)。继续第 4 步和第 5 步。

第二个选项是遵循这 7 个简单的步骤来提取元素的样式:

  1. 转到 XAML 设计器和 select 您希望从中提取样式的元素的标签 (RadTreeView)
  2. 然后转到 属性 窗格并向下滚动到 杂项 部分
  3. 展开 杂项 部分并向下滚动到 样式 字段
  4. 这个场地的右边是一个小方块。左键单击此方块打开上下文菜单
  5. 在上下文菜单中 select 转换为新资源...。这将打开一个对话框。
  6. 在对话框中为新样式命名并单击确定
  7. 您现在回到 XAML 设计器中。寻找新的风格。它被添加到您 select 编辑元素标签以提取样式的同一个文件中,并按照您之前指定的方式命名。它通常被添加到顶级资源字典

要提取模板,请重复步骤 1 和 2。然后转到 Template 字段。继续执行步骤 4 到 7。

第三个解决方案: 重构您的 code-behind 以使其与 RadTreeView 一起工作。

第四种解决方案:如果只是项目容器导致样式不兼容,请调整您的TreeView使用 Telerik 项目容器版本(而不是 TreeViewItem)。您可以通过扩展 TreeView 然后覆盖默认项目容器来实现:

public class MyExtendedTreeView : TreeView
{    
  protected override bool IsItemItsOwnContainerOverride(object item)
  {
    return (item is RadTreeViewItem);
  }

  protected override DependencyObject GetContainerForItemOverride()
  {
    return new RadTreeViewItem();
  }
}

我想这是你的选择。