Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使默认TreeView(System.Windows.Controls)具有与RadTreeView(telerik)相同的样式?_C#_Wpf_Xaml_Telerik - Fatal编程技术网

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

C# 如何使默认TreeView(System.Windows.Controls)具有与RadTreeView(telerik)相同的样式?,c#,wpf,xaml,telerik,C#,Wpf,Xaml,Telerik,我试着简单地将更改为,但它会弄乱一些方法背后的代码,所以我想我可以只应用样式,但我尝试的都不起作用 下面的代码运行良好,我尝试将静态资源更改为它编译的RadTreeItemStyle,没有问题,但在运行时出现错误,错误是“只能基于目标类型为基类型“TreeItem”的样式” ; 第一个解决方案:您可以让您的树视图扩展RadTreeView。我认为,RadTreeView有一些特殊的依赖属性,并且似乎使用了它自己的定制项目容器。这就是为什么Telerik样式在TreeView上不能正常工作的原因

我试着简单地将更改为,但它会弄乱一些方法背后的代码,所以我想我可以只应用样式,但我尝试的都不起作用

下面的代码运行良好,我尝试将静态资源更改为它编译的RadTreeItemStyle,没有问题,但在运行时出现错误,错误是“只能基于目标类型为基类型“TreeItem”的样式”


;
第一个解决方案:您可以让您的
树视图
扩展
RadTreeView
。我认为,
RadTreeView
有一些特殊的依赖属性,并且似乎使用了它自己的定制项目容器。这就是为什么Telerik样式在
TreeView
上不能正常工作的原因,尽管它最初是编译的

第二种解决方案:可以提取
RadTreeView
样式并对其进行重构,以便将其应用于WPF
TreeView

在VisualStudio中,您有两个选项。 第一个选项是遵循以下5个简单步骤:

  • 转到XAML设计器并打开设计窗格(Shift+F7)
  • 选择要从中提取样式的元素(
    RadTreeView
    ),然后右键单击它
  • 在关联菜单中,选择编辑模板->编辑副本
  • 在对话框中,输入新提取样式的名称,然后单击“确定”
  • 现在回到XAML设计器中。寻找新的款式。它已添加到您选择元素标记以提取样式的同一文件中,并按照之前指定的名称命名。它通常被添加到顶级资源字典中
  • 要提取项目模板,请重复步骤1和2。然后从关联菜单中选择编辑其他模板->编辑生成的项目(ItemTemplate)。继续执行步骤4和5

    第二个选项是按照以下7个简单步骤提取元素的样式:

  • 转到XAML设计器并选择要从中提取样式的元素的标记(
    RadTreeView
  • 然后转到属性窗格并向下滚动到杂项部分
  • 展开“杂项”部分并向下滚动到“样式”字段
  • 这块地的右边是一个小正方形。左键单击此方块可打开关联菜单
  • 在关联菜单中,选择转换为新资源。。。。这将打开一个对话框
  • 在对话框中,为新样式命名,然后单击“确定”
  • 现在回到XAML设计器中。寻找新的款式。它已添加到您选择元素标记以提取样式的同一文件中,并按照之前指定的名称命名。它通常被添加到顶级资源字典中
  • 要提取模板,请重复步骤1和2。然后转到模板字段。继续执行步骤4至7

    第三种解决方案:重构您的代码,使其与
    RadTreeView
    一起工作

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

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

    我想这是您的选择。

    您使用的是Telerik吗?
    MetroTreeViewItem
    TargetType
    是什么?只能将其应用于此类型的图元。
    RadTreeView
    不是
    TreeView
    MetroTreeViewItem
    TargetType
    TreeViewItem
    ,我猜
    RadTreeViewItem
    TargetType
    不是,但我的问题是如何绕过这个问题,将
    RadTreeView
    样式应用到默认的
    TreeView
    我想到的第一个解决方案是您提出的第二个解决方案(我认为它也需要更少的工作),你知道提取
    RadTreeView
    样式的方法吗?@KyriakosXatzisavvas更新了答案,展示了如何提取样式和模板。它仍然不能立即工作,但我想通过一些调整它会工作。我认为这是接近一个正确的答案,谢谢@Kyriakosxatzisavva最好使用第一种方法,并通过XAML设计器窗格提取样式。我觉得样式更详细
    public class MyExtendedTreeView : TreeView
    {    
      protected override bool IsItemItsOwnContainerOverride(object item)
      {
        return (item is RadTreeViewItem);
      }
    
      protected override DependencyObject GetContainerForItemOverride()
      {
        return new RadTreeViewItem();
      }
    }