簡體   English   中英

如何使默認的TreeView(System.Windows.Controls)具有與RadTreeView(telerik)相同的樣式?

[英]How to make default TreeView (System.Windows.Controls) have the same style as 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>;

第一個解決方案:您可以使TreeView擴展RadTreeView 我認為RadTreeView有一些特殊的依賴屬性,似乎也使用它自己的自定義項容器。 這就是為什么Telerik風格在TreeView上無法正常工作的原因,盡管它首先編譯。

第二個解決方案:可以提取RadTreeView樣式並重構它,以便它可以應用於WPF TreeView

在Visual Studio中,您有兩個選項。 第一個選擇是遵循以下5個簡單步驟:

  1. 轉到XAML Designer並打開設計窗格 (Shift + F7)
  2. 從( RadTreeView )中選擇要從中提取樣式的元素,然后右鍵單擊它
  3. 在上下文菜單中,選擇編輯模板 - >編輯副本
  4. 在對話框中輸入新提取樣式的名稱,然后單擊“ 確定”
  5. 您現在回到了XAML Designer中。 尋找新的風格。 它被添加到您選擇元素標記的同一文件中以提取樣式,並且命名方式與之前指定的相同。 它通常被添加到頂級資源字典中

要提取項目模板,請重復步驟1和2.然后從上下文菜單中選擇編輯其他模板 - >編輯生成的項目(ItemTemplate) 繼續第4步和第5步。

第二個選項是遵循這7個簡單的步驟來提取元素的樣式:

  1. 轉到XAML設計器並從( RadTreeView )中選擇要從中提取樣式的元素的標記
  2. 然后轉到“ 屬性”窗格並向下滾動到“ 其他”部分
  3. 展開“ 其他”部分,然后向下滾動到“ 樣式”字段
  4. 在這個領域的右邊是一個小方塊。 左鍵單擊此方塊以打開上下文菜單
  5. 在上下文菜單中,選擇轉換為新資源.... 這將打開一個對話框。
  6. 在對話框中為新樣式命名,然后單擊“ 確定”
  7. 您現在回到了XAML Designer中。 尋找新的風格。 它被添加到您選擇元素標記的同一文件中以提取樣式,並且命名方式與之前指定的相同。 它通常被添加到頂級資源字典中

要提取模板,請重復步驟1和2.然后轉到“ 模板”字段。 繼續執行步驟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();
  }
}

我認為這是你的選擇。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM