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

时间:2019-06-14 10:00:52

标签: c# wpf xaml telerik

我试图简单地将<< em> TreeView >更改为<< em> 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>;

1 个答案:

答案 0 :(得分:1)

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

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

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

  1. 转到XAML设计器并打开设计窗格(Shift + F7)
  2. 选择要从(RadTreeView)中提取样式的元素,然后右键单击它
  3. 在上下文菜单中,选择“ 编辑模板->编辑副本”
  4. 在对话框中输入新提取样式的名称,然后单击确定
  5. 您现在又回到了XAML设计器。寻找新风格。它被添加到您选择元素标记以提取样式的同一文件中,并且其名称与之前指定的名称相同。通常将其添加到顶级资源字典中

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

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

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

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

第三种解决方案: :重构后台代码,使其与RadTreeView一起使用。

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

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

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

我认为这是您的选择。