首页 > 解决方案 > 如何使默认 TreeView (System.Windows.Controls) 具有与 RadTreeView (telerik) 相同的样式?

问题描述

我尝试简单地将 < TreeView > 更改为 < RadTreeView > 但它弄乱了方法背后的一些代码,所以我认为我可以应用该样式,但我尝试过的没有任何效果。

下面的代码工作正常,我尝试将静态资源更改为 RadTreeViewItemStyle 它编译没有问题,但随后我在运行时收到错误消息“只能基于目标类型为基类型'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>;

标签: c#wpfxamltelerik

解决方案


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

第二种解决方案:可能是提取RadTreeView样式并对其进行重构,以便它可以应用于 WPFTreeView

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

  1. 转到 XAML 设计器并打开设计窗格(Shift+F7)
  2. 选择要从 ( RadTreeView) 中提取样式的元素并右键单击它
  3. 在上下文菜单中选择Edit Template -> Edit a Copy
  4. 在对话框中输入新提取样式的名称,然后单击确定
  5. 您现在回到了 XAML 设计器中。寻找新风格。它被添加到您选择元素标签以提取样式的同一文件中,并按照您之前指定的方式命名。它通常被添加到顶级资源字典中

要提取项目模板,请重复步骤 1 和 2。然后从上下文菜单中选择Edit Additional Template -> Edit Generated Items (ItemTemplate) 。继续执行步骤 4 和 5。

第二种选择是按照这 7 个简单的步骤来提取元素的样式:

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

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

第三种解决方案:重构您的代码隐藏以使其与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();
  }
}

我认为这是你的选择。


推荐阅读